我是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 ]]
答案 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)