>我有三个等长的数组,分别名为 ra、ma 和 op,其中大部分是数字,很少有实例用"nan"或"None"代替数字。例如:
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 个值。我不知道该怎么做,或者我们是否需要这样做。
有人可以指出我哪里出错了吗?
像这样删除带有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评论中提到的,使用内置itertools
模块中的compress()
函数可能会更好,因此可能会更快。它还消除了对上述每列值进行相对缓慢的线性搜索。
from itertools import compress
ra, ma, op = izip(*compress(izip(ra, ma, op), (x is not None for x in op)))