2015-08-10 3 views
2

Я пытаюсь рекурсивно определить массив numpy из N измерений. После нескольких часов работы, я столкнулся с несколькими способами, которые это может сработать (np.append и np.concatenate), однако ни один из них не дал мне желаемого результата. Я получаю либо: [-0.6778734 -0.73517866 -0.73517866 0.6778734 ] (1-d массив) или [array([-0.6778734 , -0.73517866]), array([-0.73517866, 0.6778734 ])] (список массивов)Рекурсивно определяя N-мерный массив numpy

Мой вход:

[(1.2840277121727839, array([-0.6778734, -0.73517866])), 
    (0.049083398938327472, array([-0.73517866, 0.6778734 ]))] 

Желаемый результат:

array([-0.6778734, -0.73517866], [-0.73517866, 0.6778734]) 

Является ли это возможно создать массив numpy из массивов, потому что преобразование их в списки и обратно в массивы кажется вычислительно неэффективным?

Заранее благодарен!

+0

Вы имеете в виду 2-мерный массив? – Dunes

+0

Ну, размер n x n или n x k - это то, что я собираюсь сделать, я использовал 2 x 2 в качестве простого примера, чтобы сократить время вычислений для остальной части моего алгоритма на этапе прототипирования. – MrYeerk

+0

Думаю, вопрос @Dunes возникает из-за невозможности вашего желаемого результата. Я думаю, что вам не хватает дополнительной пары фигурных скобок, которая сделала бы это двухмерным массивом: 'array ([[- 0.6778734, -0.73517866], [-0.73517866, 0.6778734]])' –

ответ

1

Ваш вход представляет собой список кортежей, каждый набор состоит из числа и массива. По какой-то причине вы хотите выбросить число и просто объединить массивы в более крупный массив - это правильно?

In [1067]: x=[(1.2840277121727839, np.array([-0.6778734, -0.73517866])), 
    (0.049083398938327472, np.array([-0.73517866, 0.6778734 ]))] 

In [1068]: x 
Out[1068]: 
[(1.2840277121727839, array([-0.6778734 , -0.73517866])), 
(0.04908339893832747, array([-0.73517866, 0.6778734 ]))] 

список понимание делает хорошую работу извлечения нужных элементов для кортежей:

In [1069]: [y[1] for y in x] 
Out[1069]: [array([-0.6778734 , -0.73517866]), array([-0.73517866, 0.6778734 ])] 

vstack и отлично подходит для объединения массивов в большую.

In [1070]: np.vstack([y[1] for y in x]) 
Out[1070]: 
array([[-0.6778734 , -0.73517866], 
     [-0.73517866, 0.6778734 ]]) 

vstack просто concatenate с дополнительным шагом, который обеспечивает входы 2d.

np.array([y[1] for y in x]) также работает, так как вы добавляете измерение.

Я предполагаю, что у array([-0.6778734, -0.73517866], [-0.73517866, 0.6778734]) есть опечатка - что ей не хватает []. Второй параметр - np.array - это dtype, а не другой список.

Обратите внимание, что как np.array, так и np.concatentate взять список. Это может быть список списков или список массивов. Это не имеет большого значения. И на этом этапе не беспокойтесь о вычислительной эффективности. Каждый раз, когда вы объединяете данные из 2 или более массивов, будет выполняться копирование. Массивы имеют фиксированный размер и не могут «расти» без создания новой копии.


In [1074]: np.concatenate([y[1] for y in x]).reshape(2,2) 
Out[1074]: 
array([[-0.6778734 , -0.73517866], 
    [-0.73517866, 0.6778734 ]]) 

Списки эффективно 1d, так что np.concatenate присоединяется к ним на этом измерении, производя 1d массив 4 элемента. reshape исправляет это. vstack делает их как (1,2), так и делает конкатенацию на 1-м измерении.

Другое выражение, которое объединяет массивы в новом измерении:

np.concatenate([y[1][None,...] for y in x], axis=0) 

[None,...] добавляет новое измерение в самом начале.

+0

Спасибо, если я правильно понял, вы говорите, что vstack работает только для n x 2 мерного массива? В противном случае я должен использовать concatenate. – MrYeerk

+0

Я попробовал 'np.concatenate ([y [1] для y в ei_rearranged])', который не работал, но работает np.array, и я предполагаю, что это будет работать для N измерений. – MrYeerk

+0

Вам нужно изменить форму результата 'concatenate'. – hpaulj

0

Попробуйте это:

import numpy as np 

a = np.array([1, 2]) 
b = np.array([3, 4]) 
print(repr(np.vstack((a, b)))) 

Дает:

array([[1, 2], 
     [3, 4]]) 
+0

'a = ei_rearranged [0] [ 1] б = ei_rearranged [1] [1] печати (np.vstack ((а, б))) '
дает выход:' [[-0,6778734 -0,73517866] [-0.73517866 0,6778734]] '
где ei_rearranged = [(1.2840277121727839, array ([- 0.6778734, -0.73517866])), (0.049083398938327472, array ([- 0.73517866, 0.6778734]))] независимо от того, что мне еще нужно определить это рекурсивно, чтобы я мог получить n измерений. Еще странно, что это не включает запятую между строками. – MrYeerk

+0

В любом месте нет запятых. Чтобы получить запятые, попробуйте: 'print (repr (arr))'. – Dunes

+0

Дает: [array ([- 0.6778734, -0.73517866]), array ([- 0.73517866, 0.6778734])] – MrYeerk

0

Вы можете сформировать требуемый 2D массив дан список input_data формы

input_data = [(1.2840277121727839, np.array([-0.6778734, -0.73517866])), 
       (0.049083398938327472, np.array([-0.73517866, 0.6778734 ]))] 

через

nparr = np.array(list(row[1] for row in input_data)) 
Смежные вопросы