这种 numpy 选择行为背后发生了什么?
What is going on behind this numpy selection behavior?
回答这个 ,其他一些人和我实际上是错误的,因为考虑到以下内容会起作用:
说一个有
test = [ [ [0], 1 ],
[ [1], 1 ]
]
import numpy as np
nptest = np.array(test)
背后的原因是什么
>>> nptest[:,0]==[1]
array([False, False], dtype=bool)
而一个有
>>> nptest[0,0]==[1],nptest[1,0]==[1]
(False, True)
或
>>> nptest==[1]
array([[False, True],
[False, True]], dtype=bool)
或
>>> nptest==1
array([[False, True],
[False, True]], dtype=bool)
是不是维度退化造成的
nptest
是object dtype的二维数组,每一行的第一个元素是一个列表。
nptest[:, 0]
是对象 dtype 的一维数组,每个元素都是列表。
当您执行 nptest[:,0]==[1]
时,NumPy 不会对 nptest[:,0]
的每个元素与列表 [1]
执行逐元素比较。它从 [1]
创建一个尽可能高维的数组,生成一维数组 np.array([1])
,然后 broadcasts 比较,将 nptest[:,0]
的每个元素与整数进行比较1.
由于nptest[:, 0]
中没有列表等于1,所以结果的所有元素都是False。
回答这个
说一个有
test = [ [ [0], 1 ],
[ [1], 1 ]
]
import numpy as np
nptest = np.array(test)
背后的原因是什么
>>> nptest[:,0]==[1]
array([False, False], dtype=bool)
而一个有
>>> nptest[0,0]==[1],nptest[1,0]==[1]
(False, True)
或
>>> nptest==[1]
array([[False, True],
[False, True]], dtype=bool)
或
>>> nptest==1
array([[False, True],
[False, True]], dtype=bool)
是不是维度退化造成的
nptest
是object dtype的二维数组,每一行的第一个元素是一个列表。
nptest[:, 0]
是对象 dtype 的一维数组,每个元素都是列表。
当您执行 nptest[:,0]==[1]
时,NumPy 不会对 nptest[:,0]
的每个元素与列表 [1]
执行逐元素比较。它从 [1]
创建一个尽可能高维的数组,生成一维数组 np.array([1])
,然后 broadcasts 比较,将 nptest[:,0]
的每个元素与整数进行比较1.
由于nptest[:, 0]
中没有列表等于1,所以结果的所有元素都是False。