np.delete矩阵中包含最大绝对值的所有行和列

时间:2018-02-16 18:45:39

标签: python

我是python的新手,只是一般的编码,我正在尝试完成这项任务,还有一件我需要帮助来完成它。

任务是生成一个带有用户输入维度的方阵,并从该矩阵创建一个新矩阵,通过删除交叉点上的行和列,其中有一个元素是矩阵元素的绝对最大值。

这是我到目前为止所得到的:

import numpy as np
print ("input number of rows in rmatr:")
n = int(input())
print ("input number of columns rmatr:")
m = int(input())

def form_rmatr():
    rmatr = np.ndarray(shape=(n,m),dtype=int) 
    for i in range(n):

        for j in range(m):

            rmatr[i,j] = np.random.randint(-50,50)

    return rmatr

a = form_rmatr()

print (a)

b=np.abs(np.max(a))

print ("absolute max value of rmatr = ", b)
max = (0,0)
for i in range(n):
    for j in range(m):
        if np.abs(a[i,j]) == np.abs(b):
            max = i, j            
            new_a = np.delete(np.delete(a,[i],0),[j],1)

print(new_a) 

现在,它确实有效,但它只删除了一个交集,第一个交叉点找到绝对最大值。我需要它来删除所有的交叉点。我尝试使用while语句而不是if,但显然,循环只是永远,因为它在原始a矩阵中搜索绝对最大值。我需要的解决方案可能是在np.delete函数内输入条件。类似np.delete(np.where...)的内容,但我不知道如何写下来。

编辑:它的作用的一个例子是

input number of rows in rmatr rmatr:

8
input number of columns rmatr:

8
[[ 29 -24 -42  14  12  18 -23  44]
 [-50   9 -41  -3 -14  30  11 -33]
 [ 14 -22 -43 -12  35  42   3  48]
 [-26  34  23  -9  47  -5 -33   6]
 [-33  29   0 -32 -26  24 -31   1]
 [ 15 -31 -40   1  47  30  33 -41]
 [ 48 -41   9  44  -4   0  17  -3]
 [-32 -23  31   5 -35   3   8 -31]]
absolute max value of rmatr =  48
[[-24 -42  14  12  18 -23  44]
 [  9 -41  -3 -14  30  11 -33]
 [-22 -43 -12  35  42   3  48]
 [ 34  23  -9  47  -5 -33   6]
 [ 29   0 -32 -26  24 -31   1]
 [-31 -40   1  47  30  33 -41]
 [-23  31   5 -35   3   8 -31]]

删除数字48所在的交叉点的行和列。 我需要的是它删除行号和列的所有交叉点,其中数字为48或-48。因此,看到还有一个这样的交叉点,我需要它看起来像:

    [[-24 -42  14  12  18 -23  ]
     [  9 -41  -3 -14  30  11  ]
     [ 34  23  -9  47  -5 -33  ]
     [ 29   0 -32 -26  24 -31  ]
     [-31 -40   1  47  30  33  ]
     [-23  31   5 -35   3   8  ]]

2 个答案:

答案 0 :(得分:3)

NumPy旨在允许您对计算进行矢量化。这通常意味着您应该很少需要本机Python for循环。 Here是矢量化的简短定义。

您可以使用5行代码执行此操作:

a = np.random.randint(-50, 50, size=(n, m), dtype=int)
ne = np.abs(a) != np.abs(a).max()
cols = np.nonzero(ne.all(axis=0))[0]
rows = np.nonzero(ne.all(axis=1))[0]
new_a = a[rows[:, None], cols]

print(a)
[[ -2  20  10  10 -25]
 [-15 -24  22 -43 -37]
 [-48  29  23 -16  23]
 [-26 -25   1 -48 -32]
 [ 22  15 -24 -24 -40]]

print(new_a)
[[ 20  10 -25]
 [-24  22 -37]
 [ 15 -24 -40]]

以上是对上述内容的演练:

我们可以直接将其大小(实际上,它的形状)指定为元组,而不是使用嵌套的for循环创建a。它是一个(n×m)阵列。

ne是一个与a形状相同的数组。只有在符合条件的地方{@ 1}},给定单元格的最大值等于整个数组的最大绝对值。 (如果我没有解释这个权利,你应该能够轻松修改。)

False

现在我们需要分别包含所有[[ True True True True True] [ True True True True True] [False True True True True] [ True True True False True] [ True True True True True]] s。

的行和列索引
True

最后,你可以使用一点advanced indexing来同时对这两个1维数组进行切片print(rows) [0 1 4] print(cols) [1 2 4]

答案 1 :(得分:-1)

希望这有效 -

import numpy as np
print ("input number of rowsm/columns in rmatr:")
n = int(input())
m = n
def form_rmatr():
    rmatr = np.ndarray(shape=(n,m),dtype=int)
    for i in range(n):
        for j in range(m):
            rmatr[i,j] = np.random.randint(-50,50)
    return rmatr
a = form_rmatr()
print (a)
b=np.abs(a).max()
print(b)
print ("absolute max value of rmatr = ", b)
max_rows=[]
max_cols=[]
for i in range(0,n):
    for j in range(0,m):
        if abs(a[i][j])==b:
            max_rows.append(i)
            max_cols.append(j)
a=np.delete(a,max_rows, axis=0)
a=np.delete(a,max_cols, axis=1)
print(a)