来自numpy docs
>>> np.where([[True, False], [True, True]],
... [[1, 2], [3, 4]],
... [[9, 8], [7, 6]])
array([[1, 8],
[3, 4]])
我正确地假设[[True, False], [True, True]]
部分是条件,并且根据docs参数,[[1, 2], [3, 4]]
和[[9, 8], [7, 6]]
分别是x和y。
那么在下面的示例中,函数究竟如何选择元素?
还有,为什么这些示例中的元素类型是列表?
>>> np.where([[True, False,True], [False, True]], [[1, 2,56], [3, 4]], [[9, 8,79], [7, 6]])
array([list([1, 2, 56]), list([3, 4])], dtype=object)
>>> np.where([[False, False,True,True], [False, True]], [[1, 2,56,69], [3, 4]], [[9, 8,90,100], [7, 6]])
array([list([1, 2, 56, 69]), list([3, 4])], dtype=object)
答案 0 :(得分:2)
在第一种情况下,每个项是(2,2)
阵列(或者更确切地说,列表可以做成这样的阵列)。对于条件中的每个True
,它返回x
中的相应项[[1 -][3,4]]
,而对于每个False
,则返回y
{{1 }}
在第二种情况下,列表参差不齐
[[- 8][- -]]
阵列是(2,)中,用2所列出。并且当转换为布尔值时,为2元素数组,且都为True。只有空列表会产生False。
In [1]: [[True, False,True], [False, True]]
Out[1]: [[True, False, True], [False, True]]
In [2]: np.array([[True, False,True], [False, True]])
Out[2]: array([list([True, False, True]), list([False, True])], dtype=object)
在其中,然后返回刚刚In [3]: _.astype(bool)
Out[3]: array([ True, True])
的值。
此第二种情况是可以理解的,但病理。
让我们用一个更简单的例子更详细地演示x
。条件数组相同:
where
在单个参数的版本,这是相当于In [57]: condition = np.array([[True, False], [True, True]])
In [58]: condition
Out[58]:
array([[ True, False],
[ True, True]])
:
condition.nonzero()
有些人发现更容易可视化该元组的In [59]: np.where(condition)
Out[59]: (array([0, 1, 1]), array([0, 0, 1]))
-3对坐标,其中transpose
为True:
condition
现在是带有3个参数和标量值的最简单版本。
In [60]: np.argwhere(condition)
Out[60]:
array([[0, 0],
[1, 0],
[1, 1]])
可视化此操作的一个好方法是具有两个屏蔽分配。
In [61]: np.where(condition, True, False) # same as condition
Out[61]:
array([[ True, False],
[ True, True]])
In [62]: np.where(condition, 100, 200)
Out[62]:
array([[100, 200],
[100, 100]])
另一种方法是使用一个In [63]: res = np.zeros(condition.shape, int)
In [64]: res[condition] = 100
In [65]: res[~condition] = 200
In [66]: res
Out[66]:
array([[100, 200],
[100, 100]])
值初始化一个数组,并在非零位置填充y
值。
x
如果In [69]: res = np.full(condition.shape, 200)
In [70]: res
Out[70]:
array([[200, 200],
[200, 200]])
In [71]: res[np.where(condition)] = 100
In [72]: res
Out[72]:
array([[100, 200],
[100, 100]])
和x
是数组,而不是标量,则此蒙版分配将需要细化,但希望对此有帮助。
答案 1 :(得分:0)
np.where(condition,x,y)
它检查条件,如果其True返回x,否则返回y
np.where([[True, False], [True, True]],
[[1, 2], [3, 4]],
[[9, 8], [7, 6]])
这里的条件是[[True, False], [True, True]]
x = [[1 , 2] , [3 , 4]]
y = [[9 , 8] , [7 , 6]]
所以它返回1,而不是9
第一条件是真第二个条件是假,从而它返回8而不是2
答案 2 :(得分:0)
阅读@hpaulj建议的broadcasting后,我想我知道该函数的工作原理。
它将尝试广播3个数组,然后,如果广播成功,它将使用True
和False
值从x或y中选择元素。
在示例中
>>>np.where([[True, False,True], [False, True]], [[1, 2,56], [3, 4]], [[9, 8,79], [7, 6]])
我们有
cnd=np.array([[True, False,True], [False, True]])
x=np.array([[1, 2,56], [3, 4]])
y=np.array([[9, 8,79], [7, 6]])
现在
>>>x.shape
Out[7]: (2,)
>>>y.shape
Out[8]: (2,)
>>>cnd.shape
Out[9]: (2,)
所以这三个都是带有2个元素(类型列表)甚至条件(cnd)的数组。因此[True, False,True]
和[False, True]
都将被评估为True
。元素将从x中选择。
>>>np.where([[True, False,True], [False, True]], [[1, 2,56], [3, 4]], [[9, 8,79], [7, 6]])
Out[10]: array([list([1, 2, 56]), list([3, 4])], dtype=object)
我还通过一个更复杂的示例(广播2x2x2
)对其进行了尝试,并且仍然对其进行了解释。
np.where([[[True,False],[True,True]], [[False,False],[True,False]]],
[[[12,45],[10,50]], [[100,10],[17,81]]],
[[[90,93],[85,13]], [[12,345], [190,56,34]]])
哪里
cnd=np.array([[[True,False],[True,True]], [[False,False],[True,False]]])
x=np.array([[[12,45],[10,50]], [[100,10],[17,81]]])
y=np.array( [[[90,93],[85,13]], [[12,345], [190,56,34]]])
此处cnd
和x
的形状为(2,2,2)
,而y
的形状为(2,2)
。
>>>cnd.shape
Out[14]: (2, 2, 2)
>>>x.shape
Out[15]: (2, 2, 2)
>>>y.shape
Out[16]: (2, 2)
现在,@ hpaulj评论y
时,将广播到(2,2,2)。
它可能看起来像这样
>>>cnd
Out[6]:
array([[[ True, False],
[ True, True]],
[[False, False],
[ True, False]]])
>>>x
Out[7]:
array([[[ 12, 45],
[ 10, 50]],
[[100, 10],
[ 17, 81]]])
>>>np.broadcast_to(y,(2,2,2))
Out[8]:
array([[[list([90, 93]), list([85, 13])],
[list([12, 345]), list([190, 56, 34])]],
[[list([90, 93]), list([85, 13])],
[list([12, 345]), list([190, 56, 34])]]], dtype=object)
结果可以很容易地预测为
>>>np.where([[[True,False],[True,True]], [[False,False],[True,False]]], [[[12,45],[10,50]], [[100,10],[17,81]]],[[[90,93],[85,13]], [[12,345], [190,56,34]]])
Out[9]:
array([[[12, list([85, 13])],
[10, 50]],
[[list([90, 93]), list([85, 13])],
[17, list([190, 56, 34])]]], dtype=object)