移动numpy数组的列和行?

3

我有一个numpy数组,其中只有一列和一行的值为零:

 ([[0. , 2.8, 3.5, 0. , 2.5, 1. , 0.8],
   [0. , 0. , 0. , 0. , 0. , 0. , 0. ],
   [3.5, 2.5, 0. , 0. , 2.8, 1.3, 1.1],
   [3.6, 3.8, 3.3, 0. , 2.5, 0.6, 0.4],
   [2.5, 1.5, 2.8, 0. , 0. , 3.1, 1.9],
   [1. , 0.8, 1.3, 0. , 3.1, 0. , 2.8],
   [0.8, 1.6, 1.1, 0. , 1.9, 2.8, 0. ]])

我希望将零行移至顶部,将零列移至左侧或删除它:
 ([[0. , 0. , 0. , 0. , 0. , 0. ]
   [0. , 2.8, 3.5, 2.5, 1. , 0.8],
   [3.5, 2.5, 0. , 2.8, 1.3, 1.1],
   [3.6, 3.8, 3.3, 2.5, 0.6, 0.4],
   [2.5, 1.5, 2.8, 0. , 3.1, 1.9],
   [1. , 0.8, 1.3, 3.1, 0. , 2.8],
   [0.8, 1.6, 1.1, 1.9, 2.8, 0. ]])

有什么快速简便的方法可以做到这一点吗? 顺便说一下,我知道列和行数,所以不需要搜索。


1
你想把零行/列“移动”到侧面还是与当前在侧面的内容交换? - miradulo
向左和向上移动。 - sten
2个回答

2
使用高级索引与np.ix_一起:
>>> import numpy as np
>>> 
>>> X = np.array( ([[0. , 2.8, 3.5, 0. , 2.5, 1. , 0.8],
...    [0. , 0. , 0. , 0. , 0. , 0. , 0. ],
...    [3.5, 2.5, 0. , 0. , 2.8, 1.3, 1.1],
...    [3.6, 3.8, 3.3, 0. , 2.5, 0.6, 0.4],
...    [2.5, 1.5, 2.8, 0. , 0. , 3.1, 1.9],
...    [1. , 0.8, 1.3, 0. , 3.1, 0. , 2.8],
...    [0.8, 1.6, 1.1, 0. , 1.9, 2.8, 0. ]]))
>>> 
>>> row = 1; col = 3
>>> h, w = X.shape
>>> i = np.r_[row, :row, row+1:h]
>>> j = np.r_[:col, col+1:w]
>>> X[np.ix_(i, j)]
array([[0. , 0. , 0. , 0. , 0. , 0. ],
       [0. , 2.8, 3.5, 2.5, 1. , 0.8],
       [3.5, 2.5, 0. , 2.8, 1.3, 1.1],
       [3.6, 3.8, 3.3, 2.5, 0.6, 0.4],
       [2.5, 1.5, 2.8, 0. , 3.1, 1.9],
       [1. , 0.8, 1.3, 3.1, 0. , 2.8],
       [0.8, 1.6, 1.1, 1.9, 2.8, 0. ]])

np.ix_文档中说:“此函数接受N个1-D序列,并返回具有N个维度的N个输出,使得在除一个维度外的所有维度上形状为1,并且具有非单位形状值的维度通过所有N个维度循环。”你能澄清一下吗?这个答案可能更聪明,但如果我在实际应用中遇到它,我需要一些注释才能理解。 - Zev
1
@Zev 这个操作是为了设置两个一维数组进行广播。可以将其视为 meshgrid 的更经济的版本。 - Paul Panzer

2
删除该列和行,然后添加一行零值即可。
这适用于您的示例。
import numpy as np
a =  np.array([[0. , 2.8, 3.5, 0. , 2.5, 1. , 0.8],
   [0. , 0. , 0. , 0. , 0. , 0. , 0. ],
   [3.5, 2.5, 0. , 0. , 2.8, 1.3, 1.1],
   [3.6, 3.8, 3.3, 0. , 2.5, 0.6, 0.4],
   [2.5, 1.5, 2.8, 0. , 0. , 3.1, 1.9],
   [1. , 0.8, 1.3, 0. , 3.1, 0. , 2.8],
   [0.8, 1.6, 1.1, 0. , 1.9, 2.8, 0. ]])

def remove_column_of_zeros_and_shift_row(a, row, col):
    without_row = np.delete(a, row, axis=0)
    without_row_and_col = np.delete(without_row, col, axis=1)
    z = np.zeros((1, len(without_row_and_col[0])))
    without_col_shifted_row = np.append(z, without_row_and_col, axis=0)
    return without_col_shifted_row

my_result = remove_column_of_zeros_and_shift_row(a, 1, 3)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接