2016-10-26 6 views
0

Это простая операция, у меня возникли сложности с выполнением с NumPy:Как объединить эти два массива 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)) 

Но это не оптимально.

ответ

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

Я хотел бы использовать 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. Вы можете использовать Dict понимание:

named_arrs = {'a%i' % (i + 1): np.hstack((arr1, v)) for i, v in enumerate(arr2)} 
+0

'a1, a2, a3, a4' Что делать, если я не» t знать априори число массивов, которые должны быть сгенерированы? Нужно использовать длину 'arr2' – ShanZhengYang

+0

@ShanZhengYang: Вы действительно хотите создать динамическое число имен переменных?Это _really_ плохая идея – Eric

+1

* «Я бы хотел четыре различных массива numpy» *. Вы можете легко собрать подмассивы в списке, если вы не хотите распаковывать их для разделения имен переменных, например. 'arrs = [np.hstack ((arr1, v)) для v в arr2]'. –

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]]) 

Такого 2d массив является удобным в себе. Но она может быть разбита на массивы:

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]]) 
Смежные вопросы