list可以存储python中的任何对象作为其元素,但是在一个列表中基于元素的运算只能通过迭代循环(效率低下)来实现。
ndarray可以避免list的效率低下的缺点,narray类似于list,但是其存储类型的灵活性不如list一样好,只有同样的元素类型可以被存储在同一列
e.g.第一列存储列表,第二列可以存储其他列表或者字典
array(in numpy)只能存储同一种类型的元素。
e.g. 所有的元素必须是浮点型、整型或者字符串。
2.1.1 Array Creation and Data Typing 有很多方法创建一个array。
ndarray可以避免list的效率低下的缺点,narray类似于list,但是其存储类型的灵活性不如list一样好,只有同样的元素类型可以被存储在同一列
e.g.第一列存储列表,第二列可以存储其他列表或者字典
array(in numpy)只能存储同一种类型的元素。
e.g. 所有的元素必须是浮点型、整型或者字符串。
虽然有诸多限制,ndarray在进行多次运算的时候,运行速度仍有显著的提升。
arr=np.arange(1e5)#<class 'numpy.ndarray'>
larr=arr.tolist()
#list没有默认的广播功能,因此用list_times模拟ndarray所做。
def list_times(alist,scalar):
for i,val in enumerate(alist):
alist[i]=val*scalar
return alist
t1=timeit.Timer('arr * 1.1',setup='from __main__ import arr' )
print(t1.timeit(1)) #0.000534083869640842
t2=timeit.Timer('list_times(larr,1.1)',setup='from __main__ import list_times,larr')
print(t2.timeit(1)) #0.029095050097559593
当我们需要进行线性代数运算时,可以使用matrix(其可以避免使用ndarray的默认广播操作)
ndarray*ndrray---A中的每个元素(i,j)*B中的每个元素(i,j)
matrix*matrix---对A和B执行矩阵乘法运算
与ndarray不同,matrix最多只能是2维,如果试图构建一个3维或以上的是不可行的。
#create a 3D numpy array
arr=np.zeros((3,3,3))
#trying to convert array to a matrix,which will not work
mat=np.matrix(arr)#ValueError: shape too large to be a matrix.
2.1.1 Array Creation and Data Typing 有很多方法创建一个array。
#创建一个list,然后用array()进行封装
alist=[1,2,3]
arr=np.array(alist)
#创建一个有5个元素且都是0的数组
arr=np.zeros(5)
#创建一个从10到100的数组
arr=np.arange(10,100)
#创建一个元素为0的5*5的数组
image=np.zeros((5,5))
#创建一个元素为1的5*5*5的数组
#astype() 设置数组元素为整型
cube=np.zeros((5,5,5)).astype(int)+1
#元素为1,类型为float16的数组
cube=np.ones((5,5,5)).astype(np.float16)
#创建数组时,numpy默认数据类型精度为当前Python环境的位深度。如果使用64位的python,那么数组也会默认为64位精度。
#可以通过dtype= 设置元素类型(int, numpy.float16, numpy.float32, or numpy.float64)
#array of zero integers
arr=np.zeros(2,dtype=int)
#array of zero floats
arr=np.zeros(2,dtype=np.float32)
#我们也可以通过多种方法,对以上创建的数组进行改造。如果数组有25个元素,我们可以使其变为5*5的数组
#创建0-999的数组
arr1d=np.arange(1000)
#改造成10*10*10 的3D数组
arr3d=arr1d.reshape((10,10,10))#等同于arr3d=np.reshape(arr1d,(10,10,10))
#相反的也可以使一个10*10*10*10的变为1000*1
arr4d=np.zeros((10,10,10,10))
arr1d=arr4d.ravel()
print(arr1d)
#