【问题标题】:Changing cells in a 4D numpy matrix subject to conditions on axis indexes根据轴索引的条件更改 4D numpy 矩阵中的单元格
【发布时间】:2021-01-09 13:45:45
【问题描述】:

假设我有一个 4D numpy 数组A,四个维度的索引为i, j, k, l,假设50 x 40 x 30 x 20。还假设我还有一些其他列表B

如何将A 中满足某些条件的所有单元格设置为0?有没有办法在没有循环的情况下有效地做到这一点(使用矢量化?)。

示例条件:所有具有第三维索引k 的单元格B[k] == x

例如,

如果我们有二维矩阵A = [[1,2],[3,4]]B = [7,8]

然后对于A 的第二维(即列),我想将第二维中的所有单元格归零,从而该维度中单元格的索引(称为索引i)满足条件@ 987654333@。在这种情况下,A 将转换为 A = [[0,0],[3,4]].

【问题讨论】:

  • 不太清楚你想要什么,你能举个简单的2D例子吗。
  • 完成!添加了一个例子

标签: python-3.x numpy vectorization numpy-ndarray


【解决方案1】:

您可以为特定轴指定布尔数组:

import numpy as np

i, j, k, l = 50, 40, 30, 20
a = np.random.random((i, j, k, l))
b_k = np.random.random(k)
b_j = np.random.random(j)

# i, j,         k, l
a[:, :, b_k < 0.5, :] = 0

# You can alsow combine multiple conditions along the different axes
# i,         j,         k, l
a[:, b_j > 0.5, b_k < 0.5, :] = 0

# Or work with the index explicitly
condition_k = np.arange(k) % 3 == 0  # Is the index divisible by 3?
# i, j,            k, l
a[:, :,  condition_k, :] = 0

使用您给出的示例


a = np.array([[1, 2],
              [3, 4]])
b = np.array([7, 8])

#      i, j
a[b == 7, :] = 0
# array([[0, 0],
#        [3, 4]])

【讨论】:

  • 这是根据条件检查其他数组 - 是否有一个使用矩阵 a 的第三维中的轴?
  • 我做了第三个例子,这是你想要的吗?
  • 请注意,我提供的第一个示例与上一个基本相同,只是另一个条件b &lt; x 而不是b == x
【解决方案2】:

以下有帮助吗?

A = np.arange(16,dtype='float64').reshape(2,2,2,2)
A[A == 2] = 3.14

我正在用 3.14 替换等于 2 的条目。您可以将其设置为其他值。

【讨论】:

  • 呃这是编辑一个特定的(已知的)单元格,而不是编辑所有满足某些条件的单元格
  • 方括号内的A == 2 是一个条件。您可以将其替换为其他条件。例如,要替换所有偶数条目,您可以这样做:A[A %2 == 0] = 3.14
  • 我明白了,有没有办法可以将条目的索引用作条件的一部分?而不仅仅是入口值?
猜你喜欢
  • 2012-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-27
  • 2021-06-29
  • 2019-03-04
  • 1970-01-01
  • 2021-09-10
相关资源
最近更新 更多