【问题标题】:numpy array slicing intersection of rows and columnsnumpy数组切片行和列的交集
【发布时间】:2019-11-21 20:04:07
【问题描述】:

我需要对一个 numpy 数组进行切片,以便获得一个对应于深绿色区域的数组: array

绿色区域是列和行中多个范围的交集。 我想到了类似的东西:

M[[1:3,5:7],[1:3,5:7]]=np.zeros(4,4)

但它不起作用。我怎样才能有效地做到这一点?

【问题讨论】:

  • 你想要多少个矩阵作为结果?每个交叉点一个或一个将小块合并成一个?
  • 单个矩阵,目的是获取切片并将其设置为零或其他值,就像我在代码示例中所做的那样
  • 我会考虑使用熊猫数据框。正如您在Documentation 中看到的那样,您可以将可调用对象传递给 iloc 函数。有了这个,你可以支持自定义切片。
  • 有了这个: M[starting_index:ending_index:step, starting_index:ending_index:step] 您可以选择内部矩阵的每个角,然后将它们堆叠在一起 例如:x[1:9:5, 1 :9:5] 将为您提供第 1 行和第 6 行,第 1 和第 6 列。对同一行的不同列执行相同操作,然后对接下来的行和列执行相同操作。最后将它们堆叠在一起,让您构建所需的矩阵。
  • @NicolaePetridean 绝对没有更有效的解决方案? Matlab 有一个等价物:M([1:2,5:6],[1:2,5:6])

标签: python arrays numpy numpy-slicing


【解决方案1】:

我认为你只需要分别做每个深绿色部分,比如:

M[1:3, 5:7] = np.zeros((2,2))

然后重复其他深绿色区域。

编辑: 我想我更了解你想做什么,你想更动态地做,所以我认为这样的事情会起作用:

ta = slice(1, 3)
tb = slice(5, 7)
slices=[ta, tb]
slices = [(s1, s2) for s1 in slices for s2 in slices] #Gives all combinations of slices
for s in slices:
    M[s] = np.zeros((2,2))

【讨论】:

  • 是的,我想过这样做,但如果存在,我正在寻找更有效的解决方案,因为我会扩大规模,它不一定是 np.zeros() 分配的矩阵,而是已经定义的矩阵。
  • 好的,我明白了,你可以使用切片吗? (我已经相应地编辑了答案)
【解决方案2】:

我在 stackoverflow 上使用 matlab like array indexing with numpy 找到了答案

我添加了一个数组来做我想做的事。最终代码为:

rows = np.hstack((np.arange(1,3), np.arange(5,7)))
cols = np.hstack((np.arange(1,3), np.arange(5,7)))

M[np.ix_(rc,rc)]=np.zeros(4,4)

也许有一种更有效的方法来定义行和列,但这对我有用

【讨论】:

  • np.hstack((x[[1,2,5,6], 1:3], x[[1,2,5,6], 5:7]))像这样我也编辑了我以前的答案。有帮助吗?
  • 似乎对我不起作用。它选择正确的矩阵,但是不可能给它分配一个值,例如: np.hstack((x[[1,2,5,6], 1:3], x[[1,2,5,6 ], 5:7]))=np.zeros((4,4))
【解决方案3】:

UPDATE 实际上是这样工作的:

np.hstack((x[[1,2,5,6], 1:3], x[[1,2,5,6], 5:7]))

我找到的最佳选择:

np.vstack((x[1:9:4, [1,2,5,6]], x[2:9:4, [1,2,5,6]])) 

但是你仍然需要相互交换线路

【讨论】:

  • 我想我做到了。我也将其发布为答案
猜你喜欢
  • 2013-02-02
  • 2020-12-14
  • 2019-06-26
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多