python numpy逆_python-具有numpy的N * M * M张量的矢量化(部分)逆

所以我有一个张量的索引为a [n,i,j]的维度为(N,M,M)的张量,我想为N中的每个n求M * M方阵部分的值.

例如,假设我有

In [1]: a = np.arange(12)

a.shape = (3,2,2)

a

Out[1]: array([[[ 0, 1],

[ 2, 3]],

[[ 4, 5],

[ 6, 7]],

[[ 8, 9],

[10, 11]]])

然后for循环反转将如下所示:

In [2]: inv_a = np.zeros([3,2,2])

for m in xrange(0,3):

inv_a[m] = np.linalg.inv(a[m])

inv_a

Out[2]: array([[[-1.5, 0.5],

[ 1. , 0. ]],

[[-3.5, 2.5],

[ 3. , -2. ]],

[[-5.5, 4.5],

[ 5. , -4. ]]])

根据github上的this issue,这显然将在NumPy 2.0中实现.

我猜我需要按照github问题线程中的seberg的说明安装开发版本,但是现在还有另一种矢量化的方法吗?

解决方法:

更新:

在NumPy 1.8和更高版本中,numpy.linalg中的函数是通用通用函数.

这意味着您现在可以执行以下操作:

import numpy as np

a = np.random.rand(12, 3, 3)

np.linalg.inv(a)

这将反转每个3×3数组,并将结果作为12x3x3数组返回.

参见numpy 1.8 release notes.

原始答案:

由于N相对较小,我们如何手动计算所有矩阵的LU分解.

这确保了所涉及的for循环相对较短.

这是使用常规NumPy语法可以完成的方法:

import numpy as np

from numpy.random import rand

def pylu3d(A):

N = A.shape[1]

for j in xrange(N-1):

for i in xrange(j+1,N):

#change to L

A[:,i,j] /= A[:,j,j]

#change to U

A[:,i,j+1:] -= A[:,i,j:j+1] * A[:,j,j+1:]

def pylusolve(A, B):

N = A.shape[1]

for j in xrange(N-1):

for i in xrange(j+1,N):

B[:,i] -= A[:,i,j] * B[:,j]

for j in xrange(N-1,-1,-1):

B[:,j] /= A[:,j,j]

for i in xrange(j):

B[:,i] -= A[:,i,j] * B[:,j]

#usage

A = rand(1000000,3,3)

b = rand(3)

b = np.tile(b,(1000000,1))

pylu3d(A)

# A has been replaced with the LU decompositions

pylusolve(A, b)

# b has been replaced to the solutions of

# A[i] x = b[i] for each A[i] and b[i]

如我所写,pylu3d修改A来计算LU分解.

用LU分解替换每个NxN矩阵后,可以使用pylusolve求解代表矩阵系统右侧的MxN数组b.

它在适当位置修改b并进行适当的后替换以解决系统问题.

在撰写本文时,此实现不包括数据透视,因此它在数值上并不稳定,但在大多数情况下应能很好地工作.

根据数组在内存中的排列方式,使用Cython可能仍会更快.

这是两个执行相同功能的Cython函数,但它们首先沿M进行迭代.

它不是向量化的,但是相对较快.

from numpy cimport ndarray as ar

cimport cython

@cython.boundscheck(False)

@cython.wraparound(False)

def lu3d(ar[double,ndim=3] A):

cdef int n, i, j, k, N=A.shape[0], h=A.shape[1], w=A.shape[2]

for n in xrange(N):

for j in xrange(h-1):

for i in xrange(j+1,h):

#change to L

A[n,i,j] /= A[n,j,j]

#change to U

for k in xrange(j+1,w):

A[n,i,k] -= A[n,i,j] * A[n,j,k]

@cython.boundscheck(False)

@cython.wraparound(False)

def lusolve(ar[double,ndim=3] A, ar[double,ndim=2] b):

cdef int n, i, j, N=A.shape[0], h=A.shape[1]

for n in xrange(N):

for j in xrange(h-1):

for i in xrange(j+1,h):

b[n,i] -= A[n,i,j] * b[n,j]

for j in xrange(h-1,-1,-1):

b[n,j] /= A[n,j,j]

for i in xrange(j):

b[n,i] -= A[n,i,j] * b[n,j]

您也可以尝试使用Numba,尽管在这种情况下,我无法让它像Cython一样快地运行.

标签:scipy,matrix,vectorization,python,numpy

来源: https://codeday.me/bug/20191123/2063993.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用numpy库中的random模块生成m*n的矩阵,具体代码如下: ```python import numpy as np m = 3 # 矩阵的行数 n = 4 # 矩阵的列数 # 生成m*n的随机矩阵 matrix = np.random.rand(m, n) print(matrix) ``` 输出结果为: ``` [[0.12345678 0.23456789 0.34567891 0.45678901] [0.56789012 0.67890123 0.78901234 0.89012345] [0.90123456 0.01234568 0.12345679 0.2345679 ]] ``` 其中,np.random.rand(m, n)函数会生成一个m行n列的随机矩阵,每个元素的值都是0到1之间的随机数。如果需要生成其他类型的矩阵,可以使用numpy库中的其他函数。 ### 回答2: Python中,numpy是常用的科学计算库之一,其中有一种数据结构是数组,它是一种类似于矩阵的数据结构。使用numpy生成矩阵可以通过numpy提供的相关函数实现。 在numpy中,可以使用函数numpy.zeros来创建一个“全零”数组,其参数为数组的形状,也就是行数和列数形成的元组。同样地,可以使用numpy.ones来创建一个“全1”数组。例如,要生成一个3行4列全零的矩阵,可以使用下面的代码: ```python import numpy as np m = 3 n = 4 arr = np.zeros(shape=(m, n)) print(arr) ``` 这里使用了import语句导入numpy,然后调用了numpy.zeros函数生成一个3行4列的全零数组,并将其存放在变量arr中,最后使用print函数输出。 同样地,要生成一个3行4列全1的矩阵,可以使用下面的代码: ```python import numpy as np m = 3 n = 4 arr = np.ones(shape=(m, n)) print(arr) ``` 此时生成的是一个3行4列全1数组。这两种方式生成的数组都可以通过下标来访问和修改其中的元素,比如可以通过arr[1, 2]来访问第2行第3列的元素。 除此之外,numpy还提供了其他的生成矩阵的函数,如numpy.random.random用于生成随机数矩阵,numpy.eye用于生成单位矩阵等。需要根据具体场景选择适合的函数。 ### 回答3: Python是一门开源的编程语言,因其简单易用且具有广泛的应用领域而备受欢迎。Python中有许多工具和库可以帮助开发人员更方便地进行数据处理和分析。其中一个极为重要的库就是NumPyNumPyPython科学计算的核心库之一,提供了高效的数组和矩阵运算。它是一个开源的库,用于数值计算。在NumPy中,使用数组来存储数据时,它们可以是不同的类型,但所有元素必须是相同的类型。 要生成m*n的矩阵,可以使用NumPy中的`numpy.zeros()`或`numpy.ones()`函数。这两个函数都可以用来创建指定大小和类型的矩阵。 `numpy.zeros()`函数用于生成全零矩阵,其用法如下: ``` import numpy as np m = 3 # 矩阵的行数 n = 4 # 矩阵的列数 # 生成全零矩阵,m行n列 matrix = np.zeros((m, n)) print(matrix) ``` 上述代码将生成一个3行4列的全零矩阵。 `numpy.ones()`函数用于生成全一矩阵,其用法如下: ``` import numpy as np m = 3 # 矩阵的行数 n = 4 # 矩阵的列数 # 生成全一矩阵,m行n列 matrix = np.ones((m, n)) print(matrix) ``` 上述代码将生成一个3行4列的全一矩阵。 此外,NumPy还提供了`numpy.empty()`函数,该函数生成随机的、未初始化的矩阵,不过由于它不会初始化矩阵,因此它的生成速度要比`numpy.zeros()`和`numpy.ones()`函数快。 总之,使用NumPy库可以方便地生成m*n的矩阵,并且它提供的许多函数可以帮助开发人员更加高效地进行数据处理和分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值