python - Numpy将二维数组附加在一起
问题描述
我正在尝试创建一个对 2-D 矩阵求幂并将结果保存在 3D 数组中的函数,其中第一个维度是指数的索引。这很重要,因为我正在求幂的矩阵的行表示有关图上不同顶点的信息。例如,如果我们有 A、A^2、A^3,每个都是形状 (50,50),我想要一个矩阵 D = (3,50,50),这样我就可以去 D[:,1,: ] 检索有关节点 1 的所有信息,并能够对其进行矩阵乘法。我的代码目前是
def expo(times,A,n):
temp = A;
result = csr_matrix.toarray(temp)
for i in range(0,times):
temp = np.dot(temp,A)
if i == 0:
result = np.array([result,csr_matrix.toarray(temp)]) # this creates a (2,50,50) array
if i > 0:
result = np.append(result,csr_matrix.toarray(temp),axis=0) # this does not work
return result
但是,这不起作用,因为在“i>0”的情况下,临时数组的形状为 (50,50) 并且无法附加。我不确定如何完成这项工作,而且我对 Numpy 中的维度感到困惑,例如为什么认为有时是 (50,1) 而有时只是 (50,)。任何人都可以帮助我使这段代码工作并一般解释这些事情应该如何在 Numpy 中完成?
解决方案
文档参考
如果要在 numpy 中堆叠矩阵,可以使用stack
函数. 如果您还希望索引对应于指数,您可能需要在输出的开头添加一个单位矩阵:
MWE
import numpy as np
def expo(A, n):
result =[np.eye(len(A)), A,]
for _ in range(n-1):
result.append(result[-1].dot(A))
return np.stack(result, axis=0)
# If you do not really need the 3D array,
# you could also just return the list
result = expo(np.array([[1,-2],[-2,1]]), 3)
print(result)
# [[[ 1. 0.]
# [ 0. 1.]]
#
# [[ 1. -2.]
# [ -2. 1.]]
#
# [[ 5. -4.]
# [ -4. 5.]]
#
# [[ 13. -14.]
# [-14. 13.]]]
print(result[1])
# [[ 1. -2.]
# [-2. 1.]]
注释
如您所见,我们首先简单地创建矩阵列表,然后在最后将它们转换为数组。不过,我不确定您是否真的需要 3D 数组,因为您也可以只索引创建的列表,但这取决于您的用例,是否方便。
我想axis
很多 numpy 函数的关键字参数一开始可能会令人困惑,但文档通常有很好的例子,结合相同的试验和错误,应该会让你走得很远。例如numpy.stack
,第一个示例确实正是您想要做的。
推荐阅读
- json - 使用 jq 将 JSON {"k1":"v1","k2":"v2"} 转换为 CSV: v1,v2
- github-api - Github API:如何获取已为 repo 加注星标并克隆它的用户列表
- java - Java - 在使用随机获取文本文件中的行时尝试避免重复
- php - 使用 PHP 在 WordPress 站点中搜索字符串并替换为新字符串
- laravel - 数据透视表中的 detach()
- python-3.x - ReadProcessMemory 无效句柄
- amazon-web-services - AWS S3 Cloudormation 更新堆栈失败
- python - Python:venn3_circles:如何在 Venn 3 圆图中获取交点的值
- python-3.x - 如何在while循环后将变量重置为初始值
- javascript - 在基于 typescript 的项目中使用 Vue js 组件