0

我有三个名为 ra、ma 和 op 的等长数组,其中大部分是数字,当它们用 'nan' 或 'None' 代替 number 时,很少有实例。例如:

ra = [0, 1, 2, nan, 8 , 3, 8, 5]
ma = [3, nan, 5, 8, 9, 6, 4, 10]
op = [7, None, 7, 9, 3, 6, None, 7]

我想为其中的数字制作一个 3d 图。我的代码是:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(ra,ma,op)

plt.show()

在我输入 plt.show() 之前一切都很好 - 然后它给了我一长串错误,其结尾如下:

"TypeError: unsupported operand type(s) for /: 'NoneType' and 'NoneType'".

可能是: 这是因为 nan 值,但我不知道如何删除它们:-/ 如果我想从 ra 中删除 nan 值(这是列表的第 4 个值),我还必须删除ma 和 op 的第四个值。而且我无法弄清楚如何做到这一点,或者我们是否需要这样做。

有人可以指出我哪里出错了吗?

4

1 回答 1

2

您可以像这样摆脱其中的列None(在 Python 2.7 或 3+ 中):

from __future__ import print_function
try:
    from itertools import izip
except ImportError:
    izip = zip

ra = [0, 1, 2, float('nan'), 8 , 3, 8, 5]
ma = [3, float('nan'), 5, 8, 9, 6, 4, 10]
op = [7, None, 7, 9, 3, 6, None, 7]

ra, ma, op = izip(*(col for col in izip(ra, ma, op) if None not in col))

print('ra =', ra)
print('ma =', ma)
print('op =', op)

输出:

ra = (0, 2, nan, 8, 3, 5)
ma = (3, 5, 8, 9, 6, 10)
op = (7, 7, 9, 3, 6, 7)

正如@Bakuriu 在评论中提到的那样,使用compress()内置itertools模块中的功能可能会更好,因此可能会更快。它还消除了对上述每一列值的相对较慢的线性搜索。

from itertools import compress
ra, ma, op =  izip(*compress(izip(ra, ma, op), (x is not None for x in op)))
于 2013-09-23T18:10:20.430 回答