这种笨拙的选择行为背后发生了什么?

kee*_*ive 7 python numpy numpy-broadcasting

通过考虑以下方法可以解决这个问题,其他一些人和我实际上是错的:

说有一个

test = [ [ [0], 1 ],
         [ [1], 1 ]
       ]
import numpy as np
nptest = np.array(test)
Run Code Online (Sandbox Code Playgroud)

背后的原因是什么?

>>> nptest[:,0]==[1]
array([False, False], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

而有人

>>> nptest[0,0]==[1],nptest[1,0]==[1]
(False, True)
Run Code Online (Sandbox Code Playgroud)


要么

>>> nptest==[1]
array([[False,  True],
       [False,  True]], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

要么

>>> nptest==1
array([[False,  True],
       [False,  True]], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

这是因为尺寸方面的退化导致了这种情况.

use*_*ica 3

nptest是一个对象数据类型的二维数组,每行的第一个元素是一个列表。

nptest[:, 0]是对象数据类型的一维数组,其每个元素都是列表。

当您这样做时nptest[:,0]==[1],NumPy 不会nptest[:,0]对列表中的每个元素执行逐元素比较[1]。它从 中创建尽可能高维的数组[1],生成一维数组np.array([1]),然后广播比较,将 的每个元素nptest[:,0]与整数 1 进行比较。

由于 in 中没有列表nptest[:, 0]等于 1,因此结果的所有元素均为 False。