Каков самый простой способ преобразовать список в массив numpy, как показано?
Я попытался сделать это с numpy.asarray()
, но в результате получилось 3 оси с транспонированными данными в результирующем массиве, хотя значения объединены.
ОБНОВЛЕНО:
Итак, asarray().reshape(1,3)
работает с однорядным. Но элемент в моем списке имеет размер (2,1) или больше, кажется, изменение формы не переносится должным образом. Как мне это сделать?
Обновлено:
Удалось сделать это за 2 шага: reshape(3,2)
, затем np.transpose()
. Интересно, есть ли одноэтапный подход?
Все списки имеют два измерения. Кажется, вы ищете сплющивать, который:
>>> x=[[1]]
>>> y=[[2]]
>>> z=[[3]]
>>> np.array((x,y,z)).flatten()
array([1, 2, 3])
Если вам нужны 3 столбца и одна строка, вы можете изменить форму специально:
>>> np.array((x,y,z)).reshape(1,3)
array([[1, 2, 3]])
Обратите внимание, это двухмерный. Плоский массив является одномерным, поэтому в нем нет смысла строки и столбца - вы можете reshape(3,1)
, чтобы увидеть разницу с массивом 3x1.
Чтобы ответить на ваше редактирование, я не думаю, что какой-либо другой способ был бы более элегантным, чем
>>> x=[[1],[2]]
>>> y=[[3],[4]]
>>> z=[[5],[6]]
>>> np.array((x,y,z)).reshape(3,2).T
array([[1, 3, 5],
[2, 4, 6]])
И это тоже вполне оптимально. Использование .T
избавит вас от явного вызова np.transpose
.
Спасибо за ответ. в результате получается массив из 3 строк x 1 столбец. как я могу его переставить? Я запустил transpose (), но результат был тот же
@Corse Я пропустил это - это считается многомерным (форма (1,3), поэтому у вас есть два измерения). См. Редактировать.
@Corse также обратите внимание, что это не совсем правильно. Существует разница между формой (3,)
и формой (3,1)
- попробуйте два изменения формы, чтобы увидеть, как на самом деле выглядят 3 строки x 1 столбец.
что означает (3,)? пустой столбец?
@Corse означает одномерный объект, не имеющий значения для строки и столбца. Я посмотрю на обновление, но имейте в виду, что менять вопросы после получения ответа довольно невежливо - в следующий раз задайте новый вопрос.
Если вам нужен двумерный массив (строка или столбец), вы можете использовать np.atleast_2d
с np.flatten
, как указано выше:
x = np.arange(10).reshape((2,5))
print(x)
>>array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
x_new = np.atleast_2d(x.flatten())
print(x_new)
>> array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
x_new = np.atleast_2d(x.flatten()).T
print(x_new)
>> array([[0],
[1],
[2],
[3],
[4],
[5],
[6],
[7],
[8],
[9]])
Случай A: объединить список из трех массивов с формой (1, 1)
в массив формы (1, 3)
Случай B: объединить список из трех массивов с формой (2, 1)
в массив формы (2, 3)
Ограничение: делайте это за один шаг. (Предположительно, единственный «шаг» - это единственный вызов функции.)
Общий ответ: соедините их! Функция numpy.concatenate()
берет список массивов и склеивает их вместе вдоль произвольной оси. Единственное ограничение заключается в том, что форма массивов должна быть одинаковой во всех других измерениях.
В следующем примере показано, как объединить список массивов N
с формой (K, 1)
в массив формы (K, N)
.
import numpy as np
list_of_arrays = [np.array([[1], [2]]), np.array([[10], [20]]), np.array([[100], [200]])]
assert list_of_arrays[0].shape == (2, 1)
assert list_of_arrays[1].shape == (2, 1)
assert list_of_arrays[2].shape == (2, 1)
result = np.concatenate(list_of_arrays, axis=1) # single step: list -> array
assert result.shape == (2, 3)
Забыл сказать - размещайте пожалуйста код, а не изображения.