你到底是怎么做的努比。哪里()选择本例中的元素?

2024-10-02 22:27:57 发布

您现在位置:Python中文网/ 问答频道 /正文

从numpydocs

>>> np.where([[True, False], [True, True]],
    ...          [[1, 2], [3, 4]],
    ...          [[9, 8], [7, 6]])
array([[1, 8],
       [3, 4]])

根据docs参数,我假设[[True, False], [True, True]]部分是条件,[[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)

Tags: 函数falsetrue元素示例docs参数object
3条回答

在第一种情况下,每个术语都是一个(2,2)数组(或者更确切地说是可以组成这样一个数组的列表)。对于条件中的每个True,它返回x中相应的项[[1 -][3,4]],对于每个False,返回来自y[[- 8][- -]]的项

在第二种情况下,名单参差不齐

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)

数组是(2,),有两个列表。当转换为布尔值时,一个2元素数组,两者都为真。只有空列表才会产生False。你知道吗

In [3]: _.astype(bool)
Out[3]: array([ True,  True])

where只返回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]))

有些人发现更容易将元组的transpose可视化,即condition为真的3对坐标:

In [60]: np.argwhere(condition)
Out[60]: 
array([[0, 0],
       [1, 0],
       [1, 1]])

现在最简单的版本有3个参数,标量值。你知道吗

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

如果xy是数组,而不是标量,那么这个掩蔽的赋值将需要细化,但希望从一开始这会有所帮助。你知道吗

np.where(condition,x,y) 它检查条件,如果其真值返回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]]

第一个条件为true,因此它返回1而不是9

第二个条件为false,因此它返回8而不是2

在阅读了@hpaulj建议的broadcasting之后,我想我知道了函数的工作原理。 它将尝试广播3个数组,然后如果广播成功,它将使用TrueFalse值从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]]])

这里cndx具有形状(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)

相关问题 更多 >