2013-11-20 5 views
1

Я пытаюсь добавить один массив Numpy к другому Numpy массива, например:NumPy добавить массив в массив

import numpy as np 
meanings = 2 
signals = 4 

def new_agent(agent_type, context_size): 
    if agent_type == 'random': 
     comm_system = np.random.random_integers(0, 1, (meanings, signals)) 
    if agent_type == 'blank': 
     comm_system = np.zeros((meanings, signals), int) 
    score_list = np.array([0., 0., 0., 0.]) 
    np.append(comm_system, score_list) 
    np.append(comm_system, context_size) 
    return comm_system 

, если я теперь называю:

random_agent = new_agent('random', 5) 

Я ожидаю, чтобы получить что-то вроде :

[[0 1 0 0] 
[1 1 0 1] 
[0. 0. 0. 0.] 
5] 

Но вместо этого я получаю только:

[[0 1 0 0] 
[1 1 0 1]] 

Так что score_list и context_size не добавляются. И то же самое имеет место, когда я вызываю new_agent() с 'blank'.

Спасибо!

ответ

2

numpy.append() возвращает новый массив, содержащий данные из его входов вместе. Он не изменяет сами входные данные, и для этого не будет никакого способа сделать это. Это связано с тем, что массивы в NumPy обычно не изменяются.

Попробуйте изменить код, чтобы получить значение, возвращаемое из append(), которое будет массивом, который вы хотите.

1

@John правильно о том, как использовать return значение от numpy.append, потому что оно не изменяет исходный массив. Однако, есть проблема с ожидаемым выходом:

[[0 1 0 0] 
[1 1 0 1] 
[0. 0. 0. 0.] 
5] 

не возможный NumPy массив из двух причин: один является то, что некоторые элементы являются целыми числами, а некоторые из них поплавки, но DTYPE Numpy массива должно быть однородным; другое состоит в том, что каждая строка имеет одинаковую длину, но массивы numpy должны иметь однородную (прямоугольную) форму.

Я думаю, что вы могли бы лучше сделать, это просто вернуть все три вещи:

  • comm_system как массив целых чисел,
  • score_list как массив поплавки,
  • и context_size как межд (а не массив).

Вы можете сделать это с кортежем:

def new_agent(agent_type, context_size): 
    if agent_type == 'random': 
     comm_system = np.random.random_integers(0, 1, (meanings, signals)) 
    if agent_type == 'blank': 
     comm_system = np.zeros((meanings, signals), int) 
    score_list = np.zeros(signals) #This is different too! No need to type out the 0, 0, ... 
    # now just return all three: 
    return comm_system, score_list, context_size 

Затем вы можете "распаковать" кортеж вроде так:

random_agent, scores, size = new_agent('random', 5) 

Или просто держать их все в одном наборе:

random_agent_info = new_agent('random', 5) 

И у вас будет

In [331]: random_agent, scores, size = new_agent('random', 5) 

In [332]: random_agent 
Out[332]: 
array([[0, 1, 1, 0], 
     [0, 1, 0, 1]]) 

In [333]: scores 
Out[333]: array([ 0., 0., 0., 0.]) 

In [334]: size 
Out[334]: 5 

In [336]: random_agent_info 
Out[336]: 
(array([[1, 1, 0, 1], 
     [0, 1, 0, 0]]), 
array([ 0., 0., 0., 0.]), 
5) 

In [337]: random_agent_info[0] 
Out[337]: 
array([[1, 1, 0, 1], 
     [0, 1, 0, 0]]) 

In [338]: random_agent_info[1] 
Out[338]: array([ 0., 0., 0., 0.]) 

In [339]: random_agent_info[2] 
Out[339]: 5 

Если вы хотите иметь comm_system и score_list быть один (3,2) массив, вы можете сделать это с помощью:

def new_agent(agent_type, context_size): 
    ... 
    return np.vstack([comm_system, score_list]), context_size 

Тогда вы получите один массив и один INT:

In [341]: random_agent, size = new_agent('random', 5) 

In [342]: random_agent 
Out[342]: 
array([[ 1., 0., 1., 1.], 
     [ 1., 0., 1., 0.], 
     [ 0., 0., 0., 0.]]) 

In [343]: size 
Out[343]: 5 
4

Вы можете использовать hstack и vstack конкатенировать массивы:

>>> from numpy import array, hstack, vstack 
>>> a = array([1, 2, 3]) 
>>> b = array([4, 5, 6]) 

>>> hstack([a, b]) 
array([1, 2, 3, 4, 5, 6]) 

>>> vstack([a, b]) 
array([[1, 2, 3], 
     [4, 5, 6]]) 
Смежные вопросы