如何无需创建中间数组,直接用NumPy数组a和c实现目标元素乘法?
如何无需创建中间数组,直接用NumPy数组a和c实现目标元素乘法?
先来看你当前的场景:你原本通过这段代码得到了预期的输出:
import numpy as np a = np.linspace(-2.5, 2.5, 6, endpoint=True) b = np.vstack((a, a)).T c = np.array([2, 1]) print(b*c)
输出结果为:
[[-5. -2.5] [-3. -1.5] [-1. -0.5] [ 1. 0.5] [ 3. 1.5] [ 5. 2.5]]
但你不想创建中间数组b,希望直接用a和c完成元素乘法,之前尝试a*c、c*a或者调整c的维度都因为广播规则报错,对吧?
其实不用额外创建中间数组,利用NumPy的广播机制就能直接实现,只需要调整a的维度让它和c匹配广播规则就行,这里有两种简单的实现方式:
方法一:给
a新增一个轴,转换为列向量import numpy as np a = np.linspace(-2.5, 2.5, 6, endpoint=True) c = np.array([2, 1]) print(a[:, np.newaxis] * c)a[:, np.newaxis]会把一维的a转换成形状为(6,1)的二维数组,和形状为(2,)的c相乘时,NumPy会自动将c广播为(1,2)的形状,这样每个a的元素都能和c的两个元素分别相乘,最终得到和原代码一致的输出。方法二:用
reshape调整a的形状
原理和上面一致,只是写法更直观:print(a.reshape(-1, 1) * c)这里的
-1让NumPy自动计算该维度的长度(也就是6),转换后a的形状为(6,1),和c广播相乘后就能得到目标结果。
另外你后来发现的方法也很实用:如果从一开始就把a定义为二维数组,比如:
a = np.linspace([-2.5, -2.5], [2.5, 2.5], 6, endpoint=True)
这样直接写a*c或者a*(2,1)就能得到预期结果,这种方式适合从源头构建符合需求的数组。
备注:内容来源于stack exchange,提问作者Paul Jurczak
相关产品推荐
相关产品推荐

