簡體   English   中英

numpy布爾索引問題

[英]Numpy boolean indexing issue

這是我使用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]

怎么了

看起來numpy在處理boolean s list時遇到麻煩。

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]

注意這里的麻煩是由於<type 'list'> type'list <type 'list'> 因此,將選擇對象更改為numpy數組

selection = np.array([i % 2 == 0 for i in range(n)])

或者,甚至更簡單:

selection = arr % 2 == 0

然后它起作用了。

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])

或者,如果我從頭開始創建mask 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])

因此,基本上,請勿嘗試使用布爾列表作為掩碼。 使用布爾數組。

請注意,您可以(應該)編寫:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM