gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 02:08:58 24 4
gpt4 key购买 nike

我对 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 ]]

最佳答案

NumPy 旨在允许您对计算进行矢量化。这通常意味着您很少需要 native 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 x m) 数组。

ne 是一个与 a 形状相同的数组。仅在满足给定单元格的最大值等于整个数组的最大绝对值的条件的地方,它才是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]]

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

print(rows)
[0 1 4]

print(cols)
[1 2 4]

最后,您可以使用一些 advanced indexing一次对这两个一维数组进行切片a

关于python - np.删除矩阵中包含最大绝对值的所有行和列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48833068/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com