【问题标题】:What is going on behind this numpy selection behavior?这种 numpy 选择行为背后发生了什么?
【发布时间】:2017-07-31 23:07:28
【问题描述】:

回答这个question,我和其他一些人实际上是错误的,因为考虑到以下内容会起作用:

说有

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)

是不是维度上的退化导致了这种情况。

【问题讨论】:

  • 在设计 NumPy 时,任何人都不想让这种交互变得简单。 NumPy 专为刚性多维数字网格而设计。试图获得除了刚性多维网格之外的任何东西都会很痛苦。
  • 故事的寓意:不要使用dtype=object 数组。它们是发育不良的 Python 列表,具有更差的性能特征,并且numpy 并非旨在处理这些对象数组中类似序列的容器的情况。

标签: python numpy array-broadcasting


【解决方案1】:

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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-08
    • 2014-04-04
    • 1970-01-01
    • 2022-01-20
    • 2016-06-28
    • 2021-02-13
    • 1970-01-01
    • 2019-08-03
    相关资源
    最近更新 更多