【问题标题】:Modifying values of a sub-array in python在python中修改子数组的值
【发布时间】:2019-05-08 04:42:31
【问题描述】:

我想在 Python 中修改子数组的值,但它并没有按照我想要的方式工作。这是一个例子,首先让我们考虑 numpy 数组:

A = np.reshape(np.arange(25),(5,5))

B = np.ones((2,3))

如果我们检查 A 的值,我们会得到:

>>> A
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])

我想在 A 中替换子数组的值

A[:,[1,3,4]][[1,3],:]

根据 B 的值。所以我正在做的事情如下:

A[:,[1,3,4]][[1,3],:] = B

我想得到:

>>> A
array([[ 0,  1,  2,  3,  4],
       [ 5,  1,  7,  1,  1],
       [10, 11, 12, 13, 14],
       [15,  1, 17,  1,  1],
       [20, 21, 22, 23, 24]])

但是 A 的值不会随着这种方法而改变。当然,我可以使用循环逐个元素地执行此操作,但问题是我想使用 16000*16000 矩阵执行此操作,因此我正在寻找一种不使用循环的方法。你能帮帮我吗?

任何帮助将不胜感激:)

【问题讨论】:

  • 你不需要定义“B”只需使用A[:,[1,3,4]][[1,3],:] = 1
  • 感谢 Attila Bognar 的回复,但这是一样的,我的意思是它不会改变 A 的值。

标签: python numpy sub-array


【解决方案1】:

这是一个令人困惑的案例。发生了什么

A[:, [1,3,4]] 

索引到A,创建一个包含A 的第1、3 和4 列的新数组。下一个表达式 [[1, 3], :] 索引该临时数组的行并设置它的值。

要正常工作,您需要为同一表达式中的列和行编制索引。但是,如果您尝试这样做,则会引发错误

A[[1,3], [1,3,4]] = B  ## Not working!

发生的事情是 numpy 将列表解释为坐标对,这不是我们在这里想要的(有关详细信息,请参阅 https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html。如果您想从 numpy 中获得最大收益,这是必不可少的阅读材料)。幸运的是,numpy 为这种情况提供了 ix_ 方法。它采用表示行和列的列表并创建可用作索引的内容。

>>> A[np.ix_([1,3],[1,3,4])] = B

>>> A
array([[ 0,  1,  2,  3,  4],
       [ 5,  1,  7,  1,  1],
       [10, 11, 12, 13, 14],
       [15,  1, 17,  1,  1],
       [20, 21, 22, 23, -1]])

【讨论】:

  • 谢谢 user2699,这正是我要找的 :) 也谢谢你的文档!
猜你喜欢
  • 2014-04-21
  • 1970-01-01
  • 1970-01-01
  • 2012-04-17
  • 2013-01-21
  • 2019-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多