Добавить массивы с разными размерами - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь присоединить или объединить два numpy массива с разными размерами.Это выглядит не очень хорошо до сих пор.

Так, например,

a = np.arange(0,4).reshape(1,4)
b = np.arange(0,3).reshape(1,3)

И я пытаюсь

G = np.concatenate(a,b,axis=0)

Я получаю сообщение об ошибке, поскольку a и b нетакое же измерение.Причина, по которой мне нужно объединить a и b, заключается в том, что я пытаюсь рекурсивно решить модель, и пространство состояний со временем меняется.Поэтому мне нужно вызвать функцию последнего значения в качестве входа, чтобы получить функцию значения для следующего периода времени и т. Д.: * 10101 *

for t in range(T-1,0,-1):

    VG,CG = findv(VT[-1])

    VT = np.append(VT,VG,axis=0)  
    CT = np.append(CT,CG,axis=0) 

Но VT имеет другое измерение от периода времени до следующего.

Кто-нибудь знает, как обращаться с массивами VT и CT numpy, которые постоянно меняют размерность?

ОК - спасибо за ввод ... Мне нужно, чтобы вывод имел следующий вид:

G = [[0, 1, 2, 3],
     [0, 1, 2]]

Итак, если я напишу G [-1], я получу последнийelement,

[0,1,2].

Я не знаю, является ли это массивом numpy?

Спасибо, Джеспер.

Ответы [ 4 ]

0 голосов
/ 13 февраля 2019
In [71]: a,b,c = np.arange(0,4), np.arange(0,3), np.arange(0,7)

Легко поместить эти массивы в список, либо сразу, либо постепенно:

In [72]: [a,b,c]
Out[72]: [array([0, 1, 2, 3]), array([0, 1, 2]), array([0, 1, 2, 3, 4, 5, 6])]
In [73]: G =[a,b]
In [74]: G.append(c)
In [75]: G
Out[75]: [array([0, 1, 2, 3]), array([0, 1, 2]), array([0, 1, 2, 3, 4, 5, 6])]

Мы можем создать массив dtype объекта из этого списка.

In [76]: np.array(G)
Out[76]: 
array([array([0, 1, 2, 3]), array([0, 1, 2]),
       array([0, 1, 2, 3, 4, 5, 6])], dtype=object)

Имейте в виду, что иногда это может привести к созданию 2d-массива (если все подмассивы имеют одинаковый размер) или к ошибке.Обычно лучше придерживаться списка.

Повторное добавление или объединение в массив обычно не рекомендуется.Правильнее поступать хитрее и медленнее, когда он работает.

Но давайте продемонстрируем:

In [80]: G = np.array([a,b])
In [81]: G
Out[81]: array([array([0, 1, 2, 3]), array([0, 1, 2])], dtype=object)

c расширяется с помощью простого объединения:

In [82]: np.concatenate((G,c))
Out[82]: 
array([array([0, 1, 2, 3]), array([0, 1, 2]), 0, 1, 2, 3, 4, 5, 6],
      dtype=object)

Вместо этого нам нужно обернуть c в собственный массив dtype объекта:

In [83]: cc = np.array([None])
In [84]: cc[0]= c
In [85]: cc
Out[85]: array([array([0, 1, 2, 3, 4, 5, 6])], dtype=object)
In [86]: np.concatenate((G,cc))
Out[86]: 
array([array([0, 1, 2, 3]), array([0, 1, 2]),
       array([0, 1, 2, 3, 4, 5, 6])], dtype=object)

В общем случае, когда мы объединяем, dtypes должны совпадать или, по крайней мере, быть совместимыми.Здесь все входные данные должны быть объектом dtype.То же самое применимо при объединении составных dtypes (структурированных массивов).Только при соединении простых числовых dtypes (и строк) мы можем игнорировать dtypes (при условии, что мы не заботимся о том, чтобы целые числа стали числами с плавающей точкой и т. Д.).

0 голосов
/ 12 февраля 2019

Вам не хватает скобок там.

Пожалуйста, обратитесь к объединенной документации ниже.

https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.concatenate.html

import numpy as np

a = np.arange(0,4).reshape(1,4)
b = np.arange(0,3).reshape(1,3)

c = np.concatenate((a,b), axis=1) #axis 1 as you have reshaped the numpy array

Приведенное выше даст вам каскадный вывод c как:

array([[0, 1, 2, 3, 0, 1, 2]])
0 голосов
/ 12 февраля 2019

Вы не можете действительно составлять массивы с разными размерами или размерами измерений.

Это список (вид желаемого результата, если я правильно понимаю):

G = [[0, 1, 2, 3],
     [0, 1, 2]]

Преобразовано в массив numy:

G_np = np.array(G)

>>> G_np.shape 
(2,)
>>> G_np 
array([list([0, 1, 2, 3]), list([0, 1, 2])], dtype=object)
>>>

Решение в вашем случае (на основе ваших требований):

a = np.arange(0,4)
b = np.arange(0,3)
G_npy = np.array([a,b])

>>> G_np.shape 
(2,)

>>> G_np 
array([array([0, 1, 2, 3]), array([0, 1, 2])], dtype=object)

>>> G_npy[-1]
array([0, 1, 2])

Редактировать: В связи с вашим вопросом в комментарии

Я должен признать, что понятия не имею, как это сделать правильно.

Но если хакерский путь в порядке (может быть, правильный), то:

G_npy = np.array([a,b])
G_npy = np.append(G_npy,None) # Allocate space for your new array
G_npy[-1] = np.arange(5) # populate the new space with new array

>>> G_npy
array([array([0, 1, 2, 3]), array([0, 1, 2]), array([0, 1, 2, 3, 4])],
      dtype=object)
>>>

Или так - но тогда нет смысла использовать numpy

temp = [i for i in G_npy]
temp.append(np.arange(5))
G_npy = np.array(temp)

ПРИМЕЧАНИЕ:

Если честно, я не думаю, что numpyхорошо для сбора предметов (список, как это).Если бы я был тобой, я бы просто продолжал добавлять реальный список.В конце я бы превратил его в numy.Но, в конце концов, я не знаю твоего заявления, поэтому я не знаю, какое отношение лучше всего

0 голосов
/ 12 февраля 2019

Попробуйте следующим образом:

import numpy as np
a = np.arange(4).reshape(2,2)
b = np.arange(6).reshape(2,3)
c = np.arange(8).reshape(2,4)
a
# array([[0, 1],
#       [2, 3]])
b
# array([[0, 1, 2],
#       [3, 4, 5]])
c
# array([[0, 1, 2, 3],
#       [4, 5, 6, 7]])
np.hstack((a,b,c))
#array([[0, 1, 0, 1, 2, 0, 1, 2, 3],
#       [2, 3, 3, 4, 5, 4, 5, 6, 7]])

Надеюсь, это поможет.Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...