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

2024-10-03 23:24:36 发布

您现在位置: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  ]]

Tags: ofinnumberforinputnprange矩阵
2条回答

希望这能奏效-

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)

NumPy被设计成允许你矢量化你的计算。这通常意味着您应该很少需要使用本机Python进行循环。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不同,我们可以直接将其大小(实际上是形状)指定为元组。它是一个(nxm)数组。你知道吗

ne是与a形状相同的数组。只有在满足条件的地方,给定单元格的最大值等于整个数组的最大绝对值。(如果我的解释不对,你应该可以很容易地修改。)

[[ 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]]

现在我们需要分别包含所有True的行和列的索引

print(rows)
[0 1 4]

print(cols)
[1 2 4]

最后,您可以使用一点advanced indexing在这两个一维数组上同时切片a。你知道吗

相关问题 更多 >