通过将矢量乘以numpy

时间:2017-10-18 12:46:36

标签: python arrays numpy

假设我有一个2D numpy数组a=[[1,-2,1,0], [1,0,0,-1]],但是我希望通过元素方式将它转换为3D numpy数组,将t=[[x0,x0,x0,x0],[x1,x1,x1,x1]]转换为1D numpy数组尺寸为3072。因此结果将是xi,大小(2,4,3072)。那我该怎么做Python numpy?

3 个答案:

答案 0 :(得分:2)

代码:

import numpy as np

# Example data taken from bendl's answer !!!
a = np.array([[1,-2,1,0], [1,0,0,-1]])
xi = np.array([1, 2, 3])

b = np.outer(a, xi).reshape(a.shape[0], -1, len(xi))

print('a:')
print(a)
print('b:')
print(b)

输出:

a:
[[ 1 -2  1  0]
 [ 1  0  0 -1]]
b:
[[[ 1  2  3]
  [-2 -4 -6]
  [ 1  2  3]
  [ 0  0  0]]

 [[ 1  2  3]
  [ 0  0  0]
  [ 0  0  0]
  [-1 -2 -3]]]

正如我所说:它看起来像outer-product并且拆分/重塑这个维度很容易。

答案 1 :(得分:1)

您可以使用numpy广播:

a = numpy.array([[1, -2, 1, 0], [1, 0, 0, -1]])
t = numpy.arange(3072 * 2).reshape(2, 3072)
# array([[   0,    1,    2, ..., 3069, 3070, 3071],            # = x0
#        [3072, 3073, 3074, ..., 6141, 6142, 6143]])           # = x1
a.shape
# (2, 4)
t.shape
# (2, 3072)

c = (a.T[None, :, :] * t.T[:, None, :]).T
# array([[[    0,     1,     2, ...,  3069,  3070,  3071],     # =  1 * x0
#         [    0,    -2,    -4, ..., -6138, -6140, -6142],     # = -2 * x0
#         [    0,     1,     2, ...,  3069,  3070,  3071],     # =  1 * x0
#         [    0,     0,     0, ...,     0,     0,     0]],    # =  0 * x0
# 
#        [[ 3072,  3073,  3074, ...,  6141,  6142,  6143],     # =  1 * x1
#         [    0,     0,     0, ...,     0,     0,     0],     # =  0 * x1
#         [    0,     0,     0, ...,     0,     0,     0],     # =  0 * x1
#         [-3072, -3073, -3074, ..., -6141, -6142, -6143]]])   # = -1 * x1

c.shape
# (2, 4, 3072)

答案 2 :(得分:0)

这可以满足您的需求吗?

import numpy as np

a = np.array([[1,-2,1,0], [1,0,0,-1]])
xi = np.array([1, 2, 3])
a = np.dstack([a * i for i in xi])

这方面的文档在这里: https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.dstack.html