【问题标题】:NumPy: create bool array like "repeat" but in multiple dimensionsNumPy:创建类似于“重复”但在多个维度中的布尔数组
【发布时间】:2014-12-06 07:13:03
【问题描述】:

我想我正在寻找与sum() 相反的东西。我们开始:

x = array([
    [False, False, False, False, False],
    [ True, False, False, False, False],
    [ True,  True, False, False, False],
    [ True,  True,  True, False, False]])

x.sum(axis=1)
Out: array([0, 1, 2, 3])

所以我想走相反的方向:从[0,1,2,3] 到像x 这样的数组(我可以在x 中指定我想要的列数,当然,在它上面是5)。

理想情况下,该解决方案也应该适用于更高的维度,当然我不想在 Python 中循环,因为输入可能比这个示例更长。也就是说,这是一个使用循环的解决方案:

s = np.array([0, 1, 2, 3])
y = np.zeros((len(s), 5), np.bool)
for row,col in enumerate(s):
    y[row,0:col] = True

【问题讨论】:

  • @WarrenWeckesser:正确!我知道如何从这里到那里......但在这里有点卡住了。
  • 在您的循环解决方案中,看起来 输入x,并且您创建了 y,但之前您说要从 [0, 1 , 2, 3] to x(即x 是输出)。从 [0,1,2,3] 到更大的布尔数组的操作不是你想要的吗?
  • 如果是这样,您可以像我在stackoverflow.com/questions/26269893/… 中所做的那样,但将比较中的相等性更改为arange(A.max()+1)<(如@DSM 的答案)。
  • @WarrenWeckesser:是的,我在问题中输入的循环代码有点混乱,所以我更新了它,希望让它更清晰/自包含/非自引用。

标签: python numpy multidimensional-array scipy


【解决方案1】:

IIUC -- 我不确定我是否这样做 -- 您可以使用 arange 和广播比较:

>>> v = np.array([0,1,3,2])
>>> np.arange(5) < v[...,None]
array([[False, False, False, False, False],
       [ True, False, False, False, False],
       [ True,  True,  True, False, False],
       [ True,  True, False, False, False]], dtype=bool)

或二维:

>>> v = np.array([[1,2],[0,2]])
>>> np.arange(5) < v[...,None]
array([[[ True, False, False, False, False],
        [ True,  True, False, False, False]],

       [[False, False, False, False, False],
        [ True,  True, False, False, False]]], dtype=bool)
>>> ((np.arange(5) < v[...,None]).sum(2) == v).all()
True

【讨论】:

  • 你确实明白了——甚至在我澄清我的例子之前。谢谢,我不会想到这个解决方案。
猜你喜欢
  • 2019-12-07
  • 2013-06-19
  • 2016-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-04
  • 1970-01-01
  • 2020-03-25
相关资源
最近更新 更多