numpy 如何丢弃数组的上下三角形部分

u2nhd7ah  于 9个月前  发布在  其他
关注(0)|答案(2)|浏览(112)

我有一个numpy数组,它代表图像数据,我这样做了

import numpy as np 

array = np.array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                  [0, 0, 0, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0],
                  [0, 0, 0, 0, 9, 8, 8, 0, 0, 0, 0, 0, 0],
                  [0, 0, 0, 0, 4, 9, 9, 0, 0, 0, 0, 0, 0],
                  [0, 0, 0, 0, 0, 6, 5, 8, 0, 0, 0, 0, 0],
                  [0, 0, 0, 0, 0, 6, 7, 0, 0, 0, 0, 0, 0],
                  [0, 0, 0, 0, 0, 5, 9, 6, 0, 0, 0, 0, 0],
                  [0, 0, 0, 0, 0, 0, 6, 5, 6, 7, 0, 0, 0],
                  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])

字符串
我的图像数据的结构与上面的结构类似(虽然不完全相同)(即大多数值都在主对角线内,上下条目中都是0。我想在我的数据中的所有图像中使用一致的(或常量而不是动态的)方法来去除0,以便它们都保持相同的形状。
例如,我能想到的当前解决方案就是像这样索引数组

array[1:, 3:-3]


并且相同的索引将应用于我的数据中的所有图像,以确保它们都具有相同的形状。我还看了numpy的triu和tril的方法,但我不太确定如何在这里应用它。
最后,我还包含了一个我试图实现的图像(即,以一致的方式去掉左边红线下方的零和右边红线上方的零)。


的数据

w80xi6nr

w80xi6nr1#

我想这可能接近你所要求的:

# Note: had to pad the original array to make it 1 column wider
array = np.array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                  [0, 0, 0, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0],
                  [0, 0, 0, 0, 9, 8, 8, 0, 0, 0, 0, 0, 0, 0],
                  [0, 0, 0, 0, 4, 9, 9, 0, 0, 0, 0, 0, 0, 0],
                  [0, 0, 0, 0, 0, 6, 5, 8, 0, 0, 0, 0, 0, 0],
                  [0, 0, 0, 0, 0, 6, 7, 0, 0, 0, 0, 0, 0, 0],
                  [0, 0, 0, 0, 0, 5, 9, 6, 0, 0, 0, 0, 0, 0],
                  [0, 0, 0, 0, 0, 0, 6, 5, 6, 7, 0, 0, 0, 0],
                  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])

n = array.shape[0]

# Make a regular mesh grid of the size you want to keep
cols, rows = np.meshgrid(np.arange(6), np.arange(n))

# Shift the column indices over to capture the diagonals
cols = cols + np.arange(n).reshape(-1, 1)

# Extract the values you want in a new array
new_array = array[(rows, cols)]
print(new_array)

字符串
输出量:

[[0 0 0 0 0 0]
 [0 0 5 6 7 0]
 [0 0 9 8 8 0]
 [0 4 9 9 0 0]
 [0 6 5 8 0 0]
 [6 7 0 0 0 0]
 [9 6 0 0 0 0]
 [5 6 7 0 0 0]
 [0 0 0 0 0 0]]


它采用从左上角开始的主对角线和对角线右侧的5个元素。

jjjwad0x

jjjwad0x2#

你可能想检查稀疏矩阵1,它提供了一致的压缩,去除了零。
示例行稀疏矩阵表示将如下:

from scipy.sparse import csr_matrix

array = np.array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
              [0, 0, 0, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0],
              [0, 0, 0, 0, 9, 8, 8, 0, 0, 0, 0, 0, 0],
              [0, 0, 0, 0, 4, 9, 9, 0, 0, 0, 0, 0, 0],
              [0, 0, 0, 0, 0, 6, 5, 8, 0, 0, 0, 0, 0],
              [0, 0, 0, 0, 0, 6, 7, 0, 0, 0, 0, 0, 0],
              [0, 0, 0, 0, 0, 5, 9, 6, 0, 0, 0, 0, 0],
              [0, 0, 0, 0, 0, 0, 6, 5, 6, 7, 0, 0, 0],
              [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])

# plot
plt.imshow(array)

字符串


的数据

sparse_array = csr_matrix(array)
print(sparse_array)
# discards zero entries
(1, 3)  5
(1, 4)  6
(1, 5)  7
(2, 4)  9
(2, 5)  8
...
(7, 9)  7

绘制它也很容易:

plt.imshow(sparse_array.toarray())



1压缩稀疏行矩阵:https://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.csr_matrix.html

相关问题