【问题标题】:Numpy - 'nested' array operations and invalid slice errorNumpy - “嵌套”数组操作和无效切片错误
【发布时间】:2015-05-19 22:52:45
【问题描述】:

我正在尝试使用存储在一组数组 (indexPositions) 中的索引来使用矩阵执行简单的数组操作。举个例子更容易解释

u[(indexPositions[:,1]):(indexPositions[:,2]),(indexPositions[:,0])]=0

对象 u 是一个大矩阵,对于给定的空间区域,我想将其值设置为零。 indexPositions[:,1] 包含“下限”索引,indexPositions[:,2] 包含“上限”索引。这反映了这样一个事实,即我想将它们之间的任何东西都设置为零,因此想在这些索引之间进行迭代。

indexPositions[:,0] 包含必须将上述行范围设置为零的列索引。

我不明白为什么不能这样做(我希望它清楚我想要实现的目标)。我确定它与 python 不了解它应该执行这些操作的顺序有关。有没有办法指定这个?矩阵非常大,这些操作发生了很多次,所以我真的不想使用慢的 python 循环。

【问题讨论】:

  • indexPositions 看起来像什么?特别是,你能粘贴indexPositions[:,1]是什么吗?
  • indexPositions[:,1] 是一个整数数组,所有这些都严格小于(组件方面)indexPositions[:,2] 我不会复制并过去整个事情,因为它很大,但提取会是[200 196 195 194 193 192 192 191 191 191 190 190 190 189 189 189 189 189 188 188 188 188 188 188 188 188 188 187 187 187 187 187 187 187 187 187 ...202 202 201 201 201 201 201 201 201 200 200 200 200 200 200 200 200 199](如果您对indexPositions[:,1/2]的每一列感兴趣,则表示翼型上表面和下表面的坐标。
  • 我从未见过有人使用索引数组作为切片的一部分。如果我手动尝试,我会遇到与您相同的错误。见docs.scipy.org/doc/numpy/user/…

标签: python arrays numpy


【解决方案1】:

为了确保我们谈论的是同一件事,我将创建一个简单的示例:

In [77]: u=np.arange(16).reshape(4,4)   
In [78]: I=np.array([[0,2,3],[1,4,2]])

In [79]: i=0
In [80]: u[I[i,0]:I[i,1],I[i,2]]
Out[80]: array([3, 7])

In [85]: i=1
In [86]: u[I[i,0]:I[i,1],I[i,2]]
Out[86]: array([ 6, 10, 14])

我为 I 使用了不同的列顺序,但这没关系。

我从第 4 列中选择 2 个元素,从第 3 列中选择 3 个元素。不同长度的结果表明我将同时对两行 I 进行操作。我可能需要在u 的平面视图上进行操作。

In [93]: [u[slice(x,y),z] for x,y,z in I]
Out[93]: [array([3, 7]), array([ 6, 10, 14])]

如果切片的长度都相同,则我更有可能在 I 行上没有循环的情况下完成所有操作。

我会再考虑一下,但我只是想确保我理解这个问题,以及为什么它可能很困难。


1u[I[:,0]:I[:,1],I[:,2]] 在切片中带有: 肯定会成为一个问题。

In [90]: slice(I[:,0],I[:,1])
Out[90]: slice(array([0, 1]), array([2, 4]), None)

抽象地说,slice 对象接受数组或列表,但 numpy 索引不接受。因此,您必须创建 2 个或更多简单切片,而不是一个复杂切片。

In [91]: [slice(x,y) for x,y in I[:,:2]]
Out[91]: [slice(0, 2, None), slice(1, 4, None)]

我已经回答了一个类似的问题,切片开始的地方来自一个列表,但所有切片的长度都相同。即第一排的0:3,第二排的2:5,第三排的4:7等等。

Access multiple elements of an array How can I select values along an axis of an nD array with an (n-1)D array of indices of that axis?

如果切片的长度都相同,则可以使用广播来构造索引数组。但最终索引仍然是数组,而不是切片。


Fast slicing of numpy array multiple times Numpy Array Slicing 处理从一维数组中获取多个切片,切片具有不同的偏移量和长度。我认为,您的问题可能会以这种方式出现。所考虑的替代方案都需要列表理解来构造切片索引。然后可以连接索引,然后进行一次索引操作,或者,多次索引并连接结果。时间随切片的数量和长度而变化。

根据前面的问题改编的构建平面索引列表的示例是:

In [130]: il=[np.arange(v[0],v[1])+v[2]*u.T.shape[1] for v in I]
# [array([12, 13]), array([ 9, 10, 11])]
In [132]: u.T.flat[np.concatenate(il)]
# array([ 3,  7,  6, 10, 14])

值与我之前的示例相同,但在 1 个列表中,而不是 2 个。

如果切片数组的长度相同,那么我们可以得到一个数组

In [145]: I2
Out[145]: 
array([[0, 2, 3],
       [1, 3, 2]])
In [146]: il=np.array([np.arange(v[0],v[1]) for v in I2])
In [147]: u[il,I2[:,2]]
Out[147]: 
    array([[ 3,  6],
           [ 7, 10]])

在这种情况下,il = I2[:,[0]]+np.arange(2) 可用于构造第一个索引数组而不是列表解析(这是我之前提到的广播)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 2021-10-23
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 2013-02-14
    相关资源
    最近更新 更多