这是一个简单的操作,我在使用numpy时遇到了麻烦:
我有两个numpy数组:
import numpy as np
arr1 = np.array([12, 13, 14, 15])
arr2 = np.array([100, 200, 300, 400])
我想要四个不同的numpy数组:
a1 = np.array([12, 13, 14, 15, 100])
a2 = np.array([12, 13, 14, 15, 200])
a3 = np.array([12, 13, 14, 15, 300])
a4 = np.array([12, 13, 14, 15, 400])
什么是" numpythonic"要做到这一点的方法?
我可以使用numpy.tile
重复第一个数组,例如
repeats = np.tile(arr1, len(arr2))
但那不是最佳的。
答案 0 :(得分:2)
我想要四个不同的numpy数组:
您确定不想要一个阵列np.array([a1, a2, a3, a4])
吗?
但那不是最佳的。
如果您关注最佳性,请以最少的副本预分配结果:
N = len(arr1)
M = len(arr2)
result = np.zeros((M, N + 1)
result[:,:N] = arr1
result[:,N] = arr2
如果你真的希望能够将这种东西写成表达式,你可以定义:
def build_arr(into, parts):
for sl, val in parts.items():
into[sl] = val
return into
result = build_arr(np.zeros(M, N + 1), {
np.s_[:,:N]: arr1,
np.s_[:,N]: arr2
})
答案 1 :(得分:1)
我会使用np.hstack
和生成器表达式:
a1, a2, a3, a4 = (np.hstack((arr1, v)) for v in arr2)
如果arr2
中有可变数量的元素,那么您可以将结果数组存储在列表中,而不是将它们解压缩为变量名称:
arrs = [np.hstack((arr1, v)) for v in arr2]
Dynamically creating variables几乎总是一个坏主意。如果你想要一个可变数量的名为数组,那么我建议你将它们存储在一个dict或其他一些名为Python的结构中。你可以使用词典理解:
named_arrs = {'a%i' % (i + 1): np.hstack((arr1, v)) for i, v in enumerate(arr2)}
答案 2 :(得分:1)
我更喜欢使用tile
:
In [1684]: np.tile(arr1,[arr2.shape[0],1])
Out[1684]:
array([[12, 13, 14, 15],
[12, 13, 14, 15],
[12, 13, 14, 15],
[12, 13, 14, 15]])
In [1685]: np.concatenate((np.tile(arr1,[arr2.shape[0],1]),arr2[:,None]),axis=1)
Out[1685]:
array([[ 12, 13, 14, 15, 100],
[ 12, 13, 14, 15, 200],
[ 12, 13, 14, 15, 300],
[ 12, 13, 14, 15, 400]])
这样的二维阵列本身很方便。但它可以拆分成数组:
In [1686]: np.split(_,arr2.shape[0])
Out[1686]:
[array([[ 12, 13, 14, 15, 100]]),
array([[ 12, 13, 14, 15, 200]]),
array([[ 12, 13, 14, 15, 300]]),
array([[ 12, 13, 14, 15, 400]])]
如果您确实需要这些数组的单独名称,请解压缩列表:
In [1687]: a1,a2,a3,a4=_
In [1688]: a1
Out[1688]: array([[ 12, 13, 14, 15, 100]])