【问题标题】:is it possible to slice a np array irregularly without a for loop and sum each row?是否可以在没有 for 循环的情况下不规则地对 np 数组进行切片并对每一行求和?
【发布时间】:2020-01-13 20:48:22
【问题描述】:

关于切片 numpy 数组的问题。

假设我有一个数组:

A = np.array([1,2,3,4,5,6,7,8,9]).reshape(3,3)

[1 2 3]
[4 5 6]
[7 8 9]

和索引:

idx = [2,2,1]

我想达到每一行的索引值..即第一行[:2],第二行[:2],第三行[:1]。我也想对切片进行求和。

我知道我可以通过以下方式实现这一目标:

for i,a in zip(idx,A):
    print(a[:i],sum(a[:i]))

输出:

[1 2] 3
[4 5] 9
[7] 7

无论如何,这可以在没有 for 循环的情况下实现吗?主要重点是做不规则切片,总和只是我想要执行的任意操作。

类似:

A[:,:idx]

只是为了说明我的意思

【问题讨论】:

  • 我认为您的问题需要更多上下文,因为在提供的示例中,您得到的是下三角形,然后水平求和,即结果可能是np.tril(A).sum(1)
  • 这只是一个随机的例子...我想提供一个索引列表(与 A 中的行数相同的长度)并按相应的索引对 A 的每一行进行切片
  • 我更改了索引,所以很明显我不想要三角形

标签: python numpy indexing slice


【解决方案1】:

您可以创建索引矩阵并通过检查索引是否在所需范围内来创建掩码。

idx = np.repeat(np.arange(0,3), 3, 0).reshape(3,3).T
row_limits = np.array([[2], [2], [1]])
mask = idx < row_limits
masked_A = np.multiply(A, mask)
# masked_A outputs:
array([[1, 2, 0],
       [4, 5, 0],
       [7, 0, 0]])

然后将sumaxis=1 一起应用

masked_A.sum(1)
# outputs: array([3, 9, 7])

【讨论】:

    猜你喜欢
    • 2021-11-18
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多