我对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被设计成允许你矢量化你的计算。这通常意味着您应该很少需要使用本机Python进行循环。Here是矢量化的简短定义。你知道吗
您可以在5行代码中完成此操作:
以下是上述内容的演练:
与使用嵌套for循环创建
a
不同,我们可以直接将其大小(实际上是形状)指定为元组。它是一个(nxm)数组。你知道吗ne
是与a
形状相同的数组。只有在满足条件的地方,给定单元格的最大值等于整个数组的最大绝对值。(如果我的解释不对,你应该可以很容易地修改。)现在我们需要分别包含所有
True
的行和列的索引最后,您可以使用一点advanced indexing在这两个一维数组上同时切片
a
。你知道吗相关问题 更多 >
编程相关推荐