gpt4 book ai didi

python - 附加到 for 循环内的 numpy 数组或列表 - 哪个更可取?

转载 作者:行者123 更新时间:2023-12-01 22:56:15 25 4
gpt4 key购买 nike

我正在编写一些如下所示的代码:

import numpy as np

A=np.array([[1,0,3,5,7],[4,0,6,2,3]])

def SMD(matrix):
if isinstance(matrix,np.ndarray)==False:
raise ValueError('The needed datatype is an array')
else:
m= matrix.shape[0]
n= matrix.shape[1]
a=np.array([])
b=np.array([0])
c=np.array([])
for i in range(m):
for j in range(n):
if matrix[i][j] !=0:
np.append(a,matrix[i][j])
np.append(c,j)
np.append(b,len(a))
return a,b,c

但是,在这种情况下,numpy append 对我不起作用。如果我改用列表而不是数组,代码运行得很好:

def SMD(matrix):
if isinstance(matrix,np.ndarray)==False:
raise ValueError('The needed datatype is an array')
else:
m= matrix.shape[0]
n= matrix.shape[1]
d=[]
e=[0]
f=[]
for i in range(m):
for j in range(n):
if matrix[i][j] !=0:
d.append(matrix[i][j])
f.append(j)
e.append(len(d))
return d,e,f

想要的输出是:

[1, 3, 5, 7, 4, 6, 2, 3], [0, 4, 8], [0, 2, 3, 4, 0, 2, 3, 4]

或作为数组(取决于使用的代码)。

当然,我想知道为什么第一个代码不起作用。

据我所知,就计算速度而言,使用数组可能更可取,但在这种情况下,它有什么不同吗?

谢谢

最佳答案

在效率方面你应该避免循环

def SMD(matrix):
bool_matrix = (matrix!=0)
return (
matrix[bool_matrix],
np.append(0, bool_matrix.sum(1).cumsum()),
np.where(bool_matrix)[1]
)

SMD(A)
#(array([1, 3, 5, 7, 4, 6, 2, 3]),
# array([0, 4, 8]),
# array([0, 2, 3, 4, 0, 2, 3, 4]))

matrix[bool_matrix] 只是 matrix 的所有非零元素

np.append(0, bool_matrix.sum(1).cumsum()) 首先计算matrix 行中非零元素的个数;然后计算累计和(从第一行到最后一行);最后,它在数组的开头添加了 0

np.where(bool_matrix)[1] 告诉您 matrix 的元素非零的列的索引。

关于python - 附加到 for 循环内的 numpy 数组或列表 - 哪个更可取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73191083/

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