我正在尝试将一个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。当我用'blank'调用new_agent()时也是如此。
谢谢!
答案 0 :(得分: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]])
答案 1 :(得分:2)
numpy.append()
返回一个新数组,其中包含来自其输入的数据。它不会修改输入本身,也没有办法这样做。这是因为NumPy中的数组通常不可调整大小。
尝试更改代码以捕获append()返回的值,这将是您想要的数组。
答案 2 :(得分:1)
@John关于如何使用numpy.append
中的 return 值是正确的,因为它不会修改原始数组。但是,您的预期输出存在问题:
[[0 1 0 0]
[1 1 0 1]
[0. 0. 0. 0.]
5]
不是一个可能的numpy数组,原因有两个:一个是一些元素是整数而一些是浮点数,但是numpy数组的dtype必须是统一的;另一个是每行的长度不一样,但是numpy数组必须具有均匀(矩形)的形状。
我认为您可能宁愿做的只是返回所有三件事:
comm_system
作为一组整数,score_list
作为一系列花车,context_size
作为int(不是数组)。你可以用元组来做到这一点:
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