我对scipy的不同版本中的追加功能有疑问。如果我在Python 2.7.3和scipy 0.10.1(numpy1.6.2)中使用了以下脚本,那么一切都很顺利。
a=(1,2,3);b=(4,5,6);append(a,b,1);array([1,2,3,4,5,6])
a=[];b=(4,5,6);append(a,b,1);array([4,5,6])
但是如果我在python2.7和scipy1.0.0(numpy 1.13.3)中运行它们:
a=(1,2,3);b=(4,5,6);append(a,b,1);
a=[];b=(4,5,6);append(a,b,1);
追踪(最近一次呼叫最后一次):
文件"",第1行,在文件中
"/usr/local/lib/python2.7/site-packages/numpy/lib/function_base.py"
, 第5152行,附后return concatenate((arr, values), axis=axis)
numpy.core._internal.AxisError:轴1超出数组的范围 维度1
但是我已经检查了function_base.py中append的功能,它们在两个版本的numpy中是相同的。你们知道为什么会这样吗?
另一个问题是,如果我使用的是python2.7,我可以使用python2.6下安装的旧版scipy / numpy吗?
提前谢谢。
答案 0 :(得分:0)
格式化已关闭,但这是我对你做什么的猜测
a=(1,2,3)
b=(4,5,6)
append(a,b,1)
# array([1,2,3,4,5,6])
a
和b
是元组。
如果我使用np.append
功能:
In [566]: np.append(a,b)
Out[566]: array([1, 2, 3, 4, 5, 6])
使用axis=0
这也有效;使用axis=1
我收到错误,因为a
只有一个维度。如果较旧版本的np.append
与axis=1
一起使用,那是因为存在错误而忽略了轴参数。 (较新的版本是正确的;您不应该尝试使用旧版本只允许axis=1
。)
我使用的是import numpy as np
,而不是from numpy import *
。这样,当我使用numpy
函数时就很清楚了。 (numpy也是scipy的基础)。
我们应该做的是:
In [569]: np.concatenate((a,b))
Out[569]: array([1, 2, 3, 4, 5, 6])
这会将a
和b
转换为1d数组,然后沿着唯一的轴连接它们,以创建一个新数组。
如果a
为空列表,则同样有效:
a=[]
b=(4,5,6)
append(a,b,1)
# array([4,5,6])
此a
是一个列表,并且具有append
方法
In [570]: a=[]
In [571]: a.append(b)
In [572]: a
Out[572]: [(4, 5, 6)]
和extend
:
In [573]: a=[]
In [574]: a.extend(b)
In [575]: a
Out[575]: [4, 5, 6]
远离np.append
。它总是让初学者感到困惑。坚持使用列表追加,np.concatenate
。
np.append
和np.stack
对于加入数组(或列表)也很有用。
迭代创建数组时,最好附加到列表并在最后创建数组:
alist = []
for i in range(5):
alist.append(i)
arr = np.array(alist)
重复列表追加是一种很好的做法。重复数组连接速度较慢。