是否可以一次将单个numpy对象赋值给多个变量?
例如,我想用np.zeros((2,), dtype=np.object)启动许多变量
我想做a,b,c = np.zeros((2,), dtype=np.object),但得到了ValueError。a=b=c=np.zeros((2,), dtype=np.object)也不能工作,因为如果我更改一个变量,其他变量也会改变。
使用上面的示例这样的三个变量,手动执行它并不是一个问题,但是当我有几十个变量时,能够以更有效的方式这样做是很方便的。
编辑-一个更具体的例子是:
a = np.zeros((2,),dtype=np.object)
b = np.zeros((2,),dtype=np.object)
c = np.zeros((2,),dtype=np.object)
a[0] = pd.Series(data=np.random.rand(10))
a[1] = pd.Series(data=np.random.rand(5))
b[0] = 'text1'
b[1] = 'text2'
c[0] = [0,0,0,0,0,0,0,0,0]
c[1] = [1,1,1,1,1]
data = {'a':a, 'b':b, 'c':c}
sio.savemat('test.mat',{'data':data})发布于 2013-11-22 20:03:59
创建多个数组的一个很好的方法是将所需输出数组的数量添加为第一个维度(axis 0)。因此,如果您希望使用dtype对象的零填充三个长度为2的数组,则可以这样做:
a, b, c = np.zeros((3,2), object)这适用于任何数组,其中解压缩是从第一个轴开始的,例如:
a, b, c = np.random.rand(3, 4, 5)
a, b = np.arange(12).reshape(2,-1)注:这和做的不一样。
a, b, c = [np.zeros((2,), object) for _ in xrange(3)]因为在这种情况下,每个数组都是单独创建的,在内存中不一定是连续的。如果使用单个数组的解压缩,则最初的数组是作为一个连续数组创建的,而新的数组只是原始数组的视图。您还没有保存原始数组,所以我看不到任何效果,但是如果存储,然后拆分数组,您会看到它们共享数据:
In [96]: orig = np.zeros((3,2), dtype=np.object)
In [97]: a, b, c = orig
In [98]: orig
Out[98]:
array([[0, 0],
[0, 0],
[0, 0]], dtype=object)
In [99]: a
Out[99]: array([0, 0], dtype=object)
In [100]: a[0] = 9
In [101]: a
Out[101]: array([9, 0], dtype=object)
In [102]: orig
Out[102]:
array([[9, 0],
[0, 0],
[0, 0]], dtype=object)但是,如果没有保存/引用其他地方的orig数组,我就不会认为这是一个问题。查看区别的唯一方法是检查标志:
In [103]: a, b, c = np.zeros((3,2), dtype=np.object)
In [104]: a.flags.owndata
Out[104]: False
In [105]: a, b, c = [np.zeros((2,), dtype=np.object) for _ in xrange(3)]
In [106]: a.flags.owndata
Out[106]: True发布于 2013-11-21 19:51:42
使用列表理解:
>>> a, b, c = [np.zeros((2,), dtype=np.object) for _ in xrange(3)]
>>> [id(x) for x in (a,b,c)]
[172542064, 171775688, 168893512] #Different objects如果您计划添加几十个这样的变量,then better use a dictionary
>>> my_vars = {x:np.zeros((2,), dtype=np.object) for x in 'abcdef'}
>>> my_vars
{'a': array([0, 0], dtype=object), 'c': array([0, 0], dtype=object), 'b': array([0, 0], dtype=object), 'e': array([0, 0], dtype=object), 'd': array([0, 0], dtype=object), 'f': array([0, 0], dtype=object)}发布于 2013-11-21 21:12:27
在实际的代码中,没有理由让这些变量仅仅是为了将它们全部插入到一个dict中。而且,也没有理由首先将值初始化为相等的数组,这样就可以将它们转变为实际需要的数组。如果你用显而易见的方式写出所有的东西,你想要解决的问题甚至永远不会出现:
data = {}
data['a'] = np.array([pd.Series(data=np.random.rand(10)),
pd.Series(data=np.random.rand(5))])
data['b'] = np.array(['text1', 'text2'])
data['c'] = np.array([[0,0,0,0,0,0,0,0,0], [1,1,1,1,1]])
sio.savemat('test.mat',{'data':data})如果您认为需要预先创建数组,然后对数组进行变异,以保证得到所需的结果,正如您在注释…中所声称的那样。首先,运行这段代码,您将看到得到三个一维对象数组,而不是其他东西的2D数组。但是,如果您不知道如何为自己确定这一点,并且不想仅仅尝试它并进行测试,那么始终可以显式地指定dtype (或者作为object,或者作为一个复杂的类型)来强制它。
同时,即使您确实需要预先创建数组(同样也不需要),仍然没有理由创建几十个独立的变量,然后在事实之后将它们放入块中。换句话说,只需这样做:
arrays = np.zeros((3,2), dtype=np.object)
data = dict(zip(string.ascii_lowercase, arrays))或者,如果出于某种原因,您真的想要完全独立的数组,而不是从高维数组中分割出来:
arrays = [np.zeros((2,), dtype=np.object) for _ in range(3)]
data = dict(zip(string.ascii_lowercase, arrays))当然,如果你多次这样做的话,你可以把所有这些都用一个函数来包装。
https://stackoverflow.com/questions/20130527
复制相似问题