2016-12-25 8 views
1

Начнем с простого примера: у меня есть массив с тремя столбцами A, B, C. Я хочу, чтобы добавить дополнительные столбцы массива:Как добавить несколько столбцов, сгенерированных из других столбцов - numpy

  • A/B

  • A/C

  • B/C

Эти новые столбцы генерируются из старых с помощью простого элементарного деления включаются все возможные комбинации, кроме симметричных (например, B/A). Это легко сделать вручную для небольшого числа начальных столбцов, но если у меня есть, например, 20 начальных столбцов, тогда 20 * (20-1)/2 = 190 новых столбцов ...

Как это сделать умным способом?

Вторая часть - это использование пользовательской функции вместо деления, например. A + B-A * B

Любая помощь, которую вы можете предоставить, будет отличной.

+0

Вторая проблема: 'mean (A, B) [i] ..' мне непонятно. Не могли бы вы пояснить «i» или добавить рабочий код, который работает для меньшего набора данных? – Divakar

+0

Я думал о чем-то, как это: Защиту myDiv (х, у): возвращение х/у обр = np.random.ranf ((5,4)) R, C = np.triu_indices (arr.shape [1], 1) #arr [:, r]/arr [:, c] #new отношения newArr = myDiv (arr [:, r], arr [,, c]) –

+0

Пожалуйста, добавьте в вопрос. Трудно читать из комментариев. – Divakar

ответ

0

Для задачи разделения, мы могли бы иметь общее решение при генерации попарные комбинации этих номеров столбцов с помощью np.triu_indices, как SO-

from __future__ import division 

r,c = np.triu_indices(arr.shape[1],1) # pairwise column IDs 
out = arr[:,r]/arr[:,c] 

образца проходит

1) 3 колонки (проверьте выходные значения):

In [74]: arr = np.random.randint(11,99,(5,3)) #Sample input array with 3 cols 

In [75]: r,c = np.triu_indices(arr.shape[1],1) 

In [76]: arr[:,r]/arr[:,c] 
Out[76]: 
array([[ 1.85714286, 0.4875 , 0.2625 ], 
     [ 0.94565217, 0.92553191, 0.9787234 ], 
     [ 0.45652174, 0.24137931, 0.52873563], 
     [ 0.84931507, 0.69662921, 0.82022472], 
     [ 0.23170732, 0.52777778, 2.27777778]]) 

In [77]: arr[:,0]/arr[:,1] 
Out[77]: array([ 1.85714286, 0.94565217, 0.45652174, 0.84931507, 0.23170732]) 

In [78]: arr[:,0]/arr[:,2] 
Out[78]: array([ 0.4875 , 0.92553191, 0.24137931, 0.69662921, 0.52777778]) 

In [79]: arr[:,1]/arr[:,2] 
Out[79]: array([ 0.2625 , 0.9787234 , 0.52873563, 0.82022472, 2.27777778]) 

2) 20 столбцов (проверьте выход):

In [71]: arr = np.random.randint(11,99,(5,20)) #Sample input array with 20 cols 

In [72]: r,c = np.triu_indices(arr.shape[1],1) 

In [73]: (arr[:,r]/arr[:,c]).shape # Verify output array shape 
Out[73]: (5, 190) 
Смежные вопросы