2015-03-18 3 views
1

У меня есть tuple, который содержит произвольную длину numpy.array, а также скаляры. Что-то вроде этого:Сочетание элементов с numpy.array и скалярами

(array([ 31.5, 31.6, 31.7, 31.8, 31.9, 32. , 32.1, 32.2, 32.3, 
    32.4, 32.5, 32.6, 32.7, 32.8, 32.9, 33. , 33.1, 33.2, 
    33.3, 33.4, 33.5, 33.6, 33.7, 33.8, 33.9, 34. , 34.1, 
    34.2, 34.3, 34.4, 34.5, 34.6, 34.7, 34.8, 34.9, 35. , 
    35.1, 35.2]), 30.0, 0.0025, 0.0, 0.0027, 0.2791, 1.5, 1.0, 100.0) 

Мой результат должен соединить каждый элемент numpy.array со всеми другими элементами в tuple. Задача состоит в том, что numpy.array появляется в произвольном месте внутри кортежа, поэтому я не могу индексировать с гарантией.

Результат должен быть итерацию (предпочтительно tuple) из numpy.array с, что-то вроде этого:

(array([31.5, 30.0, 0.0025, 0.0, 0.0027, 0.2791, 1.5, 1.0, 100.0]), 
array([31.6, 30.0, 0.0025, 0.0, 0.0027, 0.2791, 1.5, 1.0, 100.0]), 
array([31.7, 30.0, 0.0025, 0.0, 0.0027, 0.2791, 1.5, 1.0, 100.0]), 
array([31.8, 30.0, 0.0025, 0.0, 0.0027, 0.2791, 1.5, 1.0, 100.0]), 
... 
) 

я попытался решения, представленные here и here, а также itertools.product. Решения SE предполагают наличие двух независимых массивов, и itertools.product не является правильным решением.

+0

Вы можете использовать itertools продукт таким образом: 'list (itertools.product ([1,2,3], [[4, 5]]))' => '[(1, [4, 5]), (2, [4, 5]), (3, [4, 5])], который более или менее то, что вы хотите. Важная часть - сделать второй список (array/tuple) одним списком элементов (array/tuple) – Pyetras

+0

Если бы я мог определить местоположение np.array, да, но он возвращается в произвольных местах, чтобы я не мог его индексировать но в остальном, да, это сработает. –

+0

, чтобы разбить кортеж на два, вы можете использовать что-то вроде '[x for x in s if type (x) == np.ndarray] [0]' и '[x для x в s, если type (x)! = Np .ndarray] ', где' s' является исходным кортежем. – matiasg

ответ

2

Если вы не знаете положения array, вам просто нужно его найти. Я бы просто написать код следующим образом:

from numpy import array, ndarray 

a = (array([ 31.5, 31.6, 31.7, 31.8, 31.9, 32. , 32.1, 32.2, 32.3, 
    32.4, 32.5, 32.6, 32.7, 32.8, 32.9, 33. , 33.1, 33.2, 
    33.3, 33.4, 33.5, 33.6, 33.7, 33.8, 33.9, 34. , 34.1, 
    34.2, 34.3, 34.4, 34.5, 34.6, 34.7, 34.8, 34.9, 35. , 
    35.1, 35.2]), 30.0, 0.0025, 0.0, 0.0027, 0.2791, 1.5, 1.0, 100.0) 

for i, aa in enumerate(a): 
    if isinstance(aa, ndarray): 
     break 

t = tuple(s for j, s in enumerate(a) if j != i) 

newlist = [] 
for aa in a[i]: 
    newlist.append(array((aa,) + t))) 
result = tuple(newlist) 
1
import numpy as np 
x = (np.array([ 31.5, 31.6, 31.7, 31.8, 31.9, 32. , 32.1, 32.2, 32.3, 
    32.4, 32.5, 32.6, 32.7, 32.8, 32.9, 33. , 33.1, 33.2, 
    33.3, 33.4, 33.5, 33.6, 33.7, 33.8, 33.9, 34. , 34.1, 
    34.2, 34.3, 34.4, 34.5, 34.6, 34.7, 34.8, 34.9, 35. , 
    35.1, 35.2]), 30.0, 0.0025, 0.0, 0.0027, 0.2791, 1.5, 1.0, 100.0) 


components = sorted(x, key=lambda xi: np.isscalar(xi)) 
prefixes = components[0] 
suffix = components[1:] 
result = tuple(np.array([xi]+suffix) for xi in x) 
1

Это еще один способ сделать это, если вы уверены, что ваш кортеж содержит только один np.Array

C = [z for z in A if type(z) is not np.ndarray] 
B = np.array([np.append(y,C) for y in [np.nditer(x) for x in A if type(x) is np.ndarray][0]]) 
#B can be a tuple or a list 
Смежные вопросы