当前位置:首页 » 编程语言 » python矩阵运算

python矩阵运算

发布时间: 2022-02-12 07:02:15

python 矩阵运算问题

np.shape(np.ones(3))
Out[59]:(3,)
np.shape(np.ones(3).reshape((3,1)))
Out[62]:(3,1)

Ⅱ 求python高手详细解答。代码实现的是矩阵的乘法运算。高分追加

用 python的 List comprehensions 语法生成了两个随机数矩阵 A,B,用_表示不关心该位置的变量,其实只要执行足够次数就行。

result其实是结果矩阵,用0初始化
后面的就是标准的矩阵乘法了。 result(i,j)=Sum(A(i,k)*B(k,j)) k遍历0..n_middle-1

Ⅲ python的矩阵可以做什么

python的numpy库提供矩阵运算的功能,因此我们在需要矩阵运算的时候,需要导入numpy的包。
计算矩阵对应行列的最大、最小值、和。
3>>>a1=mat([[1,1],[2,3],[4,2]])
>>> a1
matrix([[1, 1],
[2, 3],
[4, 2]])
计算每一列、行的和
>>>a2=a1.sum(axis=0) #列和,这里得到的是1*2的矩阵
>>> a2
matrix([[7, 6]])
>>>a3=a1.sum(axis=1) #行和,这里得到的是3*1的矩阵
>>> a3
matrix([[2],
[5],
[6]])
>>>a4=sum(a1[1,:]) #计算第一行所有列的和,这里得到的是一个数值
>>> a4
5 #第0行:1+1;第2行:2+3;第3行:4+2
计算最大、最小值和索引
>>>a1.max() #计算a1矩阵中所有元素的最大值,这里得到的结果是一个数值
4
>>>a2=max(a1[:,1]) #计算第二列的最大值,这里得到的是一个1*1的矩阵
>>> a2
matrix([[3]])
>>>a1[1,:].max() #计算第二行的最大值,这里得到的是一个一个数值
3
>>>np.max(a1,0) #计算所有列的最大值,这里使用的是numpy中的max函数
matrix([[4, 3]])
>>>np.max(a1,1) #计算所有行的最大值,这里得到是一个矩阵
matrix([[1],
[3],
[4]])
>>>np.argmax(a1,0) #计算所有列的最大值对应在该列中的索引
matrix([[2, 1]])
>>>np.argmax(a1[1,:]) #计算第二行中最大值对应在该行的索引
1

Ⅳ python矩阵乘法是什么

python实现矩阵乘法的方法

def matrixMul(A, B):

res = [[0] * len(B[0]) for i in range(len(A))]

for i in range(len(A)):

for j in range(len(B[0])):

for k in range(len(B)):

res[i][j] += A[i][k] * B[k][j]

return res

def matrixMul2(A, B):

return [[sum(a * b for a, b in zip(a, b)) for b in zip(*B)] for a in A]

a = [[1,2], [3,4], [5,6], [7,8]]

b = [[1,2,3,4], [5,6,7,8]]

print matrixMul(a,b)

print matrixMul(b,a)

乘积形式

除了上述的矩阵乘法以外,还有其他一些特殊的“乘积”形式被定义在矩阵上,值得注意的是,当提及“矩阵相乘”或者“矩阵乘法”的时候,并不是指代这些特殊的乘积形式,而是定义中所描述的矩阵乘法。在描述这些特殊乘积时,使用这些运算的专用名称和符号来避免表述歧义。

Ⅳ 如何用 Python 科学计算中的矩阵替代循环

因为在Mathematica中使用循环确实是低效的。。。。。。
深层次的原因涉及到Mathematica的底层实现所以我不太懂,但是至少从下面几个例子可以看出Mathematica里确实有很多比循环更好的方法

求和
首先举一个最简单的求和例子,求的值。为了测试运行时间取n=10^6
一个刚接触Mathematica的同学多半会这样写

sum = 0;
For[i = 1, i <= 10^6, i++,
sum += Sin[N@i]];
(*其中N@i的作用是把整数i转化为浮点数,类似于C里的double*)
sum

为了便于计时用Mole封装一下,运行时间是2.13秒,如下图

然后一个有一定Mathematica经验的同学多半会知道同样作为循环的Do速度比For快,于是他可能会这么写
然后一个有一定Mathematica经验的同学多半会知道同样作为循环的Do速度比For快,于是他可能会这么写

sum = 0;
Do[sum += Sin[N@i], {i, 1, 10^6}];
sum

如下图,用时1.37秒,比For快了不少

当然了知道Do速度比For快的同学不太可能不知道Sum函数,所以上面其实是我口胡的,他应该会这么写

Sum[Sin[N@i], {i, 1, 10^6}]

如下图,同样的结果,只用了不到0.06秒

如果这位同学还知道Listable属性并且电脑内存不算太小的话,他也可能会这么写

Tr@Sin[N@Range[10^6]]

如下图,只用了不到0.02秒,速度超过For循环的100倍

当然了这只是一个最简单的例子,而且如果数据量更大的话最后一种方法就不能用了。但是这也足以说明在求和时用循环是低效的,无论是内置的Sum函数还是向量化运算,在效率上都远远高于循环
(这部分模仿了不同程序员如何编写阶乘函数这篇文章,强烈推荐对Mathematica有兴趣的同学去看看)

迭代
接下来举一个迭代的例子,(即Logistic map),取,为了测试运行时间同样取n=10^6
还是先用For循环的做法

x = 0.5;
For[i = 1, i <= 10^6, i++,
x = 3.5 x (1 - x);
];
x

如下图,运行时间2.06秒

(Do循环和For类似,篇幅所限这里就不写了,有兴趣的同学可以自行尝试)
(Do循环和For类似,篇幅所限这里就不写了,有兴趣的同学可以自行尝试)
然后看看内置的Nest函数

Nest[3.5 # (1 - #) &, 0.5, 10^6]

如下图,用时0.02秒,又是将近两个数量级的效率差异

当然了Nest的使用涉及到纯函数,对于Mathematica初学者来说可能有些难以理解,而且一些比较复杂的迭代不太容易写成Nest的形式,但是在迭代时Nest(还包括Fold)的效率确实要好于循环
当然了Nest的使用涉及到纯函数,对于Mathematica初学者来说可能有些难以理解,而且一些比较复杂的迭代不太容易写成Nest的形式,但是在迭代时Nest(还包括Fold)的效率确实要好于循环
遍历列表
依然举一个简单的例子:求一个列表中偶数的个数。为测试生成10^6个1到10之间的随机整数

list = RandomInteger[{1, 10}, 10^6];
(*生成10^6个随机整数*)

如果用For循环的话代码是这样的

num = 0;
For[i = 1, i <= 10^6, i++,
If[EvenQ@list[[i]], num++]
];
num

如下图,用时1.73秒

保留上面的思路,单纯的将For循环改为Scan (相当于没有返回结果的Map),代码如下

num = 0;
Scan[If[EvenQ@#, num++] &, list];
num

如下图,用时0.91 秒

(Do循环用时1.00秒左右,篇幅所限就不传图了)

摒弃循环的思路,用其他内置函数写

Count[list, _?EvenQ] // AbsoluteTiming
(*直接用Count数出list中偶数的个数*)
Count[EvenQ /@ list, True] // AbsoluteTiming
(*用Map对list中的每个数判断是否偶数,然后用Count数出结果中True的个数*)
Select[list, EvenQ] // Length // AbsoluteTiming
(*选取list中的所有偶数,然后求结果列表长度*)
Count[EvenQ@list, True] // AbsoluteTiming
(*利用EvenQ的Listable属性直接判断list的每个数是否偶数,然后数出结果中True的个数*)
Sum[Boole[EvenQ@i], {i, list}]
(*对list中的每个元素判断是否偶数,将结果相加*)

结果如下图

这个遍历的例子举得不算特别恰当,但也能说明一些问题了:Mathematica中内置了许多神奇的函数,其中大部分只要使用得当效率都比循环高(而且不是一点半点)。就算非要用循环,也要记得(任何能用Do代替For的时候)
这个遍历的例子举得不算特别恰当,但也能说明一些问题了:Mathematica中内置了许多神奇的函数,其中大部分只要使用得当效率都比循环高(而且不是一点半点)。就算非要用循环,也要记得(任何能用Do代替For的时候)
Do比For快
,(遍历列表时)
Scan比Do快
用向量(矩阵)运算代替循环
这个例子来自如何用 Python 科学计算中的矩阵替代循环? - Kaiser 的回答,我只是把代码从Python翻译成了Mathematica而已。选这个例子是因为它有比较明确的物理意义,而且效率对比非常明显
代码如下

AbsoluteTiming[
n = 100;
u = unew = SparseArray[{{1, _} -> 1}, {n, n}] // N // Normal;
For[k = 1, k <= 3000, k++,
For[i = 2, i < n, i++,
For[j = 2, j < n, j++,
unew[[i, j]] =
0.25 (u[[i + 1, j]] + u[[i - 1, j]] + u[[i, j + 1]] +
u[[i, j - 1]])
]
];
u = unew;
];
u1 = u;
]
(*用三重循环,迭代3000次*)
ArrayPlot[u1, DataReversed -> True, ColorFunction -> "TemperatureMap"]
(*用ArrayPlot绘图*)

AbsoluteTiming[
n = 100;
u = SparseArray[{{1, _} -> 1}, {n, n}] // N // Normal;
Do[
u[[2 ;; -2, 2 ;; -2]] =
0.25 (u[[3 ;; -1, 2 ;; -2]] + u[[1 ;; -3, 2 ;; -2]] +
u[[2 ;; -2, 3 ;; -1]] + u[[2 ;; -2, 1 ;; -3]]),
{k, 1, 3000}];
u2 = u;
]
(*用矩阵运算,迭代3000次*)
ArrayPlot[u2, DataReversed -> True, ColorFunction -> "TemperatureMap"]
(*用ArrayPlot绘图*)

运行结果For循环用时136秒,矩阵运算用时不足0.5秒,且两者答案完全一样。在算法完全相同的情况下两种写法有着超过200倍的效率差距
(图片太长了这里就不直接显示了,链接放在下面)
http://pic4.mg.com/_b.png

===========================我是结尾的分隔线===============================
这个答案其实从一开始就跑题了,还写了这么长的目的就在于希望让大家切实地感受到循环的低效并安利一下Mathematica中其它高效的方法。正如wolray的答案中说的,既然选择了使用Mathematica就应该多利用些MMA独有的美妙函数,毕竟如果只是用循环的话C和Fortran之类的语言效率比MMA不知高到哪里去了。。。。。。

然我也不是让大家就不用循环了,毕竟很多时候循环的直观性和易读性带来的便利远远比那点效率重要。只是希望大家在循环之前能稍稍想一下,自己的目的是不是
一定要用循环?可不可以用内置函数代替循环?就像上面的几个例子,将循环换成内置函数程序的简洁性和效率都大幅提高,长此以往相信你一定会爱上MMA的~

题外话——关于用编译提速循环

MMA中如果一定要使用循环又对效率有一定要求的话,可以选择使用编译,效率能有极大的提高。比如上面的第4个例子使用Complie编译过后的Do循环
用时只有1.86秒,速度提升了将近100倍。如果电脑中有C编译器的话还可以在Compile中加入CompilationTarget ->
"C"选项,速度还能有所提升。编译过后的代码如下:

In[10]:= cf = Compile[{{n, _Integer}, {times, _Integer}},
Mole[{u},
u = ConstantArray[0., {n, n}];
u[[1]] = ConstantArray[1., n];
Do[
Do[u[[i, j]] =
0.25 (u[[i + 1, j]] + u[[i - 1, j]] + u[[i, j + 1]] +
u[[i, j - 1]]),
{i, 2, n - 1}, {j, 2, n - 1}
], {k, 1, times}];
u
]
];
u3 = cf[100, 3000]; // AbsoluteTiming
ArrayPlot[u3, DataReversed -> True, ColorFunction -> "TemperatureMap"]

Out[11]= {1.86055, Null}

前3个例子也都可以通过编译提速很多,这里就不放代码了,有兴趣的同学可以自己动手试一试,如果遇到问题欢迎在评论中与我交流。
需要注意的是编译有很多注意事项,这里推荐一篇写的很好的教程,编译中常见的问题里面都有很好的讲解:怎样编译(Compile)/编译的通用规则/学会这6条,你也会编译
但是一般来讲编译很麻烦,而且再怎么编译效率也很难赶上直接用C,所以个人并不特别建议MMA初学者学习编译。

Ⅵ python实现矩阵乘法的方法

python实现矩阵乘法的方法
本文实例讲述了python实现矩阵乘法的方法。分享给大家供大家参考。

具体实现方法如下:
def matrixMul(A, B):
res = [[0] * len(B[0]) for i in range(len(A))]
for i in range(len(A)):
for j in range(len(B[0])):
for k in range(len(B)):
res[i][j] += A[i][k] * B[k][j]
return res
def matrixMul2(A, B):
return [[sum(a * b for a, b in zip(a, b)) for b in zip(*B)] for a in A]
a = [[1,2], [3,4], [5,6], [7,8]]
b = [[1,2,3,4], [5,6,7,8]]
print matrixMul(a,b)
print matrixMul(b,a)
print "-"*90
print matrixMul2(a,b)
print matrixMul2(b,a)
print "-"*90
from numpy import dot
print map(list,dot(a,b))
print map(list,dot(b,a))

#Out:
#[[11, 14, 17, 20], [23, 30, 37, 44], [35, 46, 57, 68], [47, 62, 77, 92]]
#[[50, 60], [114, 140]]
#------------------------------------------------------------------------
#[[11, 14, 17, 20], [23, 30, 37, 44], [35, 46, 57, 68], [47, 62, 77, 92]]
#[[50, 60], [114, 140]]
#------------------------------------------------------------------------
#[[11, 14, 17, 20], [23, 30, 37, 44], [35, 46, 57, 68], [47, 62, 77, 92]]
#[[50, 60], [114, 140]]
希望本文所述对大家的Python程序设计有所帮助。

Ⅶ Python解决矩阵问题

我也研究了很久,终于发现问题了. 函数没错. 错在定义 earth 的时候. earth = [[0]*n]*n # does not workearth = [[0,0,0],[0,0,0],[0,0,0]] # work 如果想 python 当中应用矩阵运算. 你就需要了解 numpy 这个库. 你可以网络一下 "numpy 莫烦

Ⅷ 用python写一个能计算矩阵的程序

用numpy库(你得自己安装这个库,科学计算经常用得着)

矩阵运算大大简化

fromnumpyimport*
a=array([(1,2),(3,4)])
b=array([(4,3),(2,1)])
a+b

Ⅸ 求python高手详细解答。代码实现的是矩阵的乘法运算。高分追加。

for _ in range()# 你把下划线换成 i 或者 j 比较符合习惯。。下划线开头的是一个变量。

热点内容
轻应用缓存 发布:2025-05-18 00:31:02 浏览:251
鸟存储空气 发布:2025-05-18 00:20:24 浏览:201
linux刻录iso 发布:2025-05-18 00:16:15 浏览:663
php动态参数 发布:2025-05-18 00:12:05 浏览:425
安卓应用上传 发布:2025-05-18 00:11:57 浏览:803
数对的算法 发布:2025-05-18 00:11:02 浏览:382
linuxwhile 发布:2025-05-18 00:10:08 浏览:144
xpftp外网 发布:2025-05-17 23:58:11 浏览:386
如何评价一个服务器的性能 发布:2025-05-17 23:40:53 浏览:271
淘宝客适合什么服务器 发布:2025-05-17 23:39:26 浏览:614