# Python 在 for 循环中附加到 numpy 数组或列表 哪个更可取

I'm working on some code which looks like the following:

``````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
n= matrix.shape
a=np.array([])
b=np.array()
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
``````

However, the numpy append does not work for me in this case. If I instead use lists instead of arrays, the code runs just fine:

``````def SMD(matrix):
if isinstance(matrix,np.ndarray)==False:
raise ValueError('The needed datatype is an array')
else:
m= matrix.shape
n= matrix.shape
d=[]
e=
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
``````

the wanted output is:

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

Or as arrays (depending on the code used).

Of course, I would like to know why the first code is not working.

From my knowledge, it can be preferable in terms of computation speed to use arrays, but in this case, does it make a difference?

Thanks

## 推荐答案

In terms of efficiency you you should avoid loops

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

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]` are simply all the non-zero elements of `matrix`

`np.append(0, bool_matrix.sum(1).cumsum())` first compute the number of non-zero elements in the rows of `matrix`; then it compute the cumulative sum (from the first row to the last one); finally it add the `0` at the beginning of the array.

`np.where(bool_matrix)` tells you the indices of the columns in which the elements of `matrix` are non-zero.