day*_*yum 8 python numpy vectorization multidimensional-array numpy-broadcasting
我需要创建一个2D数组,其中每一行可以以不同的数字开头和结尾.假设每行的第一个和最后一个元素被给出,所有其他元素只是根据行的长度进行插值在一个简单的例子中,假设我想创建一个3X3数组,其相同的开始位于0但不同的结尾由W给出:
array([[ 0., 1., 2.],
[ 0., 2., 4.],
[ 0., 3., 6.]])
Run Code Online (Sandbox Code Playgroud)
有没有比以下更好的方法:
D=np.ones((3,3))*np.arange(0,3)
D=D/D[:,-1]
W=np.array([2,4,6]) # last element of each row assumed given
Res= (D.T*W).T
Run Code Online (Sandbox Code Playgroud)
Div*_*kar 13
这是一种使用方法broadcasting-
def create_ranges(start, stop, N, endpoint=True):
if endpoint==1:
divisor = N-1
else:
divisor = N
steps = (1.0/divisor) * (stop - start)
return steps[:,None]*np.arange(N) + start[:,None]
Run Code Online (Sandbox Code Playgroud)
样品运行 -
In [22]: # Setup start, stop for each row and no. of elems in each row
...: start = np.array([1,4,2])
...: stop = np.array([6,7,6])
...: N = 5
...:
In [23]: create_ranges(start, stop, 5)
Out[23]:
array([[ 1. , 2.25, 3.5 , 4.75, 6. ],
[ 4. , 4.75, 5.5 , 6.25, 7. ],
[ 2. , 3. , 4. , 5. , 6. ]])
In [24]: create_ranges(start, stop, 5, endpoint=False)
Out[24]:
array([[ 1. , 2. , 3. , 4. , 5. ],
[ 4. , 4.6, 5.2, 5.8, 6.4],
[ 2. , 2.8, 3.6, 4.4, 5.2]])
Run Code Online (Sandbox Code Playgroud)
我们可以利用multi-core与numexpr模块的大数据,并获得存储效率,从而表现-
import numexpr as ne
def create_ranges_numexpr(start, stop, N, endpoint=True):
if endpoint==1:
divisor = N-1
else:
divisor = N
s0 = start[:,None]
s1 = stop[:,None]
r = np.arange(N)
return ne.evaluate('((1.0/divisor) * (s1 - s0))*r + s0')
Run Code Online (Sandbox Code Playgroud)
现在可以向start和 的stop参数提供类似数组的值np.linspace。
对于问题中给出的示例,语法为:
>>> np.linspace((0, 0, 0), (2, 4, 6), 3, axis=1)
array([[0., 1., 2.],
[0., 2., 4.],
[0., 3., 6.]])
Run Code Online (Sandbox Code Playgroud)
新axis参数指定生成数据的方向。默认情况下它是0:
>>> np.linspace((0, 0, 0), (2, 4, 6), 3)
array([[0., 0., 0.],
[1., 2., 3.],
[2., 4., 6.]])
Run Code Online (Sandbox Code Playgroud)