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

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追加不适用于我.如果我使用列表而不是数组,则代码运行得很好:

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相关问答推荐

收件箱转换错误- polars.exceptions. ComputeHelp- pandera(0.19.0b3)带有polars

列表上值总和最多为K(以O(log n))的最大元素数

DataFrame groupby函数从列返回数组而不是值

根据在同一数据框中的查找向数据框添加值

未删除映射表的行

如何访问所有文件,例如环境变量

切片包括面具的第一个实例在内的眼镜的最佳方法是什么?

为什么以这种方式调用pd.ExcelWriter会创建无效的文件格式或扩展名?

DataFrames与NaN的条件乘法

Python—从np.array中 Select 复杂的列子集

递归访问嵌套字典中的元素值

如何在UserSerializer中添加显式字段?

Django RawSQL注释字段

基于形状而非距离的两个numpy数组相似性

numpy.unique如何消除重复列?

循环浏览每个客户记录,以获取他们来自的第一个/最后一个渠道

提取数组每行的非零元素

解决Geopandas和Altair中的正图和投影问题

Python:从目录内的文件导入目录

如何在SQLAlchemy + Alembic中定义一个"Index()",在基表中的列上