好,所以我觉得应该有一种使用matplotlib创建3维散点图的简单方法。我有一个3D numpy数组(dset
),其中0表示我不想要的点,而1表示我想要的点,基本上要绘制它,现在我必须像这样通过三个for:
循环:
for i in range(30):
for x in range(60):
for y in range(60):
if dset[i, x, y] == 1:
ax.scatter(x, y, -i, zdir='z', c= 'red')
关于如何更有效地完成此操作的任何建议?任何想法将不胜感激。
[如果您具有这样的dset
,并且只想获取1
值,则可以使用nonzero
,它“返回一个数组元组,每个数组对应a
的维,其中包含该维度中非零元素的索引。”。
例如,我们可以制作一个简单的3d数组:
>>> import numpy
>>> numpy.random.seed(29)
>>> d = numpy.random.randint(0, 2, size=(3,3,3))
>>> d
array([[[1, 1, 0],
[1, 0, 0],
[0, 1, 1]],
[[0, 1, 1],
[1, 0, 0],
[0, 1, 1]],
[[1, 1, 0],
[0, 1, 0],
[0, 0, 1]]])
并找到非零元素的位置:
>>> d.nonzero()
(array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2]), array([0, 0, 1, 2, 2, 0, 0, 1, 2, 2, 0, 0, 1, 2]), array([0, 1, 0, 1, 2, 1, 2, 0, 1, 2, 0, 1, 1, 2]))
>>> z,x,y = d.nonzero()
[如果我们想进行更复杂的切割,我们可以完成(d > 3.4).nonzero()
之类的操作,因为True的整数值为1,并且算作非零。
最后,我们绘制:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x, y, -z, zdir='z', c= 'red')
plt.savefig("demo.png")
给予
[如果要避免使用nonzero
选项(例如,如果您有一个3D numpy数组,其值应该是数据点的颜色值),则可以执行您的操作,但要保存一些行通过使用ndenumerate
进行编码。
您的示例可能会变成:
for index, x in np.ndenumerate(dset):
if x == 1:
ax.scatter(*index, c = 'red')
我想关键是,您不需要嵌套for循环即可迭代多维numpy数组。