Warm tip: This article is reproduced from serverfault.com, please click

python-将行[NumPy或Tensorflow]的索引值之前的行中的值设置为零

(python - Set values in row to zero before index value of row [NumPy or Tensorflow])

发布于 2020-11-28 00:17:33

我有一个A形状为(N,)的数组我以N = 5为例:

A = np.array([0,1,1,0,1])

我想将其转换为以下NxN矩阵BNumPy和Tensorflow中的解决方案都不错,但后者是首选。

B = np.array([[0,1,1,0,1],
              [0,1,1,0,1],
              [0,1,1,0,1],
              [0,0,0,0,1],
              [0,0,0,0,1]])

一种解决方案可以包括以下步骤:

  1. 重复数组AN次
  2. 循环遍历每一行i查找最后i-th一行零的索引,直到该元素为止
  3. 用零替换该索引之前的所有元素。

N = 10的另一个例子:

D = np.array([0,1,1,1,0,0,1,1,0,0])
E = np.array([[0,1,1,1,0,0,1,1,0,0],
              [0,1,1,1,0,0,1,1,0,0],
              [0,1,1,1,0,0,1,1,0,0],
              [0,1,1,1,0,0,1,1,0,0],
              [0,0,0,0,0,0,1,1,0,0],
              [0,0,0,0,0,0,1,1,0,0],
              [0,0,0,0,0,0,1,1,0,0],
              [0,0,0,0,0,0,1,1,0,0],
              [0,0,0,0,0,0,0,0,0,0],
              [0,0,0,0,0,0,0,0,0,0]])
Questioner
rafiko1
Viewed
11
fdermishin 2020-11-28 18:16:29
A = np.array([0,1,1,0,1])
N = A.shape[0]
column = (A > 0).reshape((N, 1))
mask = np.ones((N, N), dtype=np.bool)
mask = np.where(column, False, np.tril(mask, -1))
mask = np.cumsum(mask, axis=0)
B = np.where(mask, 0, np.tile(A, (N, 1)))
[[0 1 1 0 1]
 [0 1 1 0 1]
 [0 1 1 0 1]
 [0 0 0 0 1]
 [0 0 0 0 1]]

解释

  1. 计算下三角矩阵
[[False False False False False]
 [ True False False False False]
 [ True  True False False False]
 [ True  True  True False False]
 [ True  True  True  True False]]
  1. 在A中找到一个并用False填充相应的行
[[False False False False False]
 [False False False False False]
 [False False False False False]
 [ True  True  True False False]
 [False False False False False]]
  1. 计算累积总和以将零设置为下面的所有行。这是应该清零的所有元素的掩码
[[0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]
 [1 1 1 0 0]
 [1 1 1 0 0]]
  1. 重复数组AN次
[[0 1 1 0 1]
 [0 1 1 0 1]
 [0 1 1 0 1]
 [0 1 1 0 1]
 [0 1 1 0 1]]
  1. 掩盖其元素
[[0 1 1 0 1]
 [0 1 1 0 1]
 [0 1 1 0 1]
 [0 0 0 0 1]
 [0 0 0 0 1]]