这是我使用numpy
的代码段import numpy as np
n = 10
arr = np.array(range(n))
print(arr)
selection = [i % 2 == 0 for i in range(n)]
print(selection)
neg_selection = np.invert(selection)
print(neg_selection)
print(arr[selection])
print(arr[neg_selection])
以上代码打印:
[0 1 2 3 4 5 6 7 8 9]
[True, False, True, False, True, False, True, False, True, False]
[False True False True False True False True False True]
[1 0 1 0 1 0 1 0 1 0]
[1 3 5 7 9]
最后两个预期的印刷品是:
[0 2 4 6 8]
[1 3 5 7 9]
这里有什么问题?
答案 0 :(得分:2)
看起来numpy在处理list
的{{1}}时遇到了问题。
boolean
它产生了:
n = 10
arr = np.array(range(n))
selection = [i % 2 == 0 for i in range(n)]
neg_selection = np.invert(selection)
print(type(selection), arr[selection])
print(type(neg_selection), arr[neg_selection])
注意到此处的问题是由<type 'list'> [1 0 1 0 1 0 1 0 1 0]
<type 'numpy.ndarray'> [1 3 5 7 9]
造成的。
因此,将选择对象更改为numpy数组
<type 'list'>
或者,甚至更简单:
selection = np.array([i % 2 == 0 for i in range(n)])
然后它奏效了。
答案 1 :(得分:1)
In [63]: arr=np.arange(10)
In [64]: arr
Out[64]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [65]: mask = [n%2==0 for n in arr]
In [66]: mask
Out[66]: [True, False, True, False, True, False, True, False, True, False]
尝试使用此列表编制索引:
In [67]: arr[mask]
/usr/local/bin/ipython3:1: FutureWarning: in the future, boolean array-likes will be handled as a boolean array index
#!/usr/bin/python3
Out[67]: array([1, 0, 1, 0, 1, 0, 1, 0, 1, 0])
它将您的列表视为索引整数列表,而不是布尔值;同如:
In [72]: arr[[3,0,2,0,1,0,5,0,2]]
Out[72]: array([3, 0, 2, 0, 1, 0, 5, 0, 2])
我想知道您使用np.invert
的原因,但后来意识到使用列表,~
不起作用:
In [68]: arr[~mask]
...
TypeError: bad operand type for unary ~: 'list'
invert
将列表转换为数组并执行not
In [69]: np.invert(mask)
Out[69]: array([False, True, False, True, False, True, False, True, False, True], dtype=bool)
In [70]: arr[np.invert(mask)]
Out[70]: array([1, 3, 5, 7, 9])
我们可以not
那个数组:
In [71]: arr[~np.invert(mask)]
Out[71]: array([0, 2, 4, 6, 8])
或者,如果我从一开始就创建了掩码array
:
In [73]: mask = np.array([n%2==0 for n in arr])
In [74]: arr[mask]
Out[74]: array([0, 2, 4, 6, 8])
基本上,不要尝试使用布尔列表作为掩码。使用布尔数组。
答案 2 :(得分:0)
请注意,你可以(应该)写:
arr = np.arange(n) # elements of arr have the same type as n (int, float, complex, etc)
arr = np.arange(n, dtype=int)
arr = np.arange(n, dtype=float)
取决于arr
的所需类型。