ndarray:一种多维数组对象
ndarray是一个通用的同构数据多维容器,也就是说,其中的所有元素必须是相同类型的。每个数组都有一个shape(一个表示各维度大小的元组)和一个dtype(一个用于说明数组数据类型的对象)。
In [1]: import numpy as np In [2]: data = np.array([[1,2,3,4],[5,6,7,8]]) In [3]: data Out[3]: array([[1, 2, 3, 4], [5, 6, 7, 8]])
In [5]: data.shape Out[5]: (2, 4) In [6]: data.dtype Out[6]: dtype('int32')
Part 1 :创建ndarray的方法
array()
arange()
linspace()
zeros()
ones()
empty()
eye()
一 array()
类似Python中的列表,但有两点不同。
array长度是预先定好的,没有append方法。
执行乘法操作时。示例。
import numpy as np a=np.array([1,2,3,4,5]) print('numpy',a*6) l=[1,2,3,4,5] print('python',l*5)
输出:
numpy [ 6 12 18 24 30] python [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
应用场景 1)
假如有这样一个场景,将[1,2,3,4,5,6,7] 美元货币转为人民币,这个时候,numy.array便能较好的实现效果。
python能不能实现呢?也是可以的。两种方法,一种方法是循环遍历,乘以汇率。另外一种是使用内置函数map函数。有逼格。
注意,python3中,map返回的是迭代器。
import numpy as np a=np.array([1,2,3,4,5]) print('numpy',a*6) l=[1,2,3,4,5] print('python',l*5) print('map函数',list(map(lambda x:x*6,l)))
应用场景 2)
有1000个商品,每个商品数量随机,商品价格随机,求总金额。 array实现起来也比较简单。
最后调用 .sum()方法
import numpy as np import random p=np.array([random.uniform(10,200) for _ in range(1000)]) n=np.array([random.randint(20,30) for _ in range(1000)]) print((p*n).sum()) #.sum()
同样,用python能不能实现呢?也是可以的,有两种方法。一种方法是for循环,一种方法是使用内置函数zip函数。很有逼格,老铁。
方法1:
s=0 p=[random.uniform(10,200) for _ in range(1000)] n=[random.randint(10,20) for _ in range(1000)] for i in range(1000): s+=p[i]*n[i] print(s)
方法2 :zip方法。注意,zip函数返回来的是一个迭代器。zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
p=[random.uniform(10,200) for _ in range(1000)] n=[random.randint(10,20) for _ in range(1000)] s=0 for price,num in zip(p,n): s+=price*num print(s)
二 linspace(x,y,n)
将x-y,之间 n 均等分
类似arange(),第三个参数为数组长度。
x=np.linspace(-100,100,10000) x
输出:
array([-100. , -99.979998, -99.959996, ..., 99.959996, 99.979998, 100. ])
利用linspace画图
import numpy as np import matplotlib.pyplot as plt x=np.linspace(-100,100,10000) y=x**2 plt.plot(x,y) plt.show()
输出:
三 arange()
基本和range方法一样用
不同点,步长支持浮点数。
arr=np.arange(1,20,0.5) arr
输出:
array([ 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5, 5. , 5.5, 6. , 6.5, 7. , 7.5, 8. , 8.5, 9. , 9.5, 10. , 10.5, 11. , 11.5, 12. , 12.5, 13. , 13.5, 14. , 14.5, 15. , 15.5, 16. , 16.5, 17. , 17.5, 18. , 18.5, 19. , 19.5])
四 zeros()
根据指定形状和dtype,创建全0数组
arr=np.zeros(10) arr
输出: 默认是浮点型
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
可以指定类型,参数是dtype
arr=np.zeros(10,dtype='int') arr
输出:
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
可以创建二维数组
arr=np.zeros((3,4),dtype='int') arr
输出:
array([[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]])
五 ones()
和zeros 类似,根据指定形状和dtype,创建全1 数组,可以创建二维数组。
六 empty()
根据指定形状和dtype,创建空数组(随机数填充),可以创建二维数组。
arr=np.empty(100) arr
输出:
array([7.33501733e-312, 0.00000000e+000, 3.60739284e-313, 4.94065646e-324, 7.33501739e-312, 7.33501604e-312, 7.33371324e-312, 5.30498948e-313, 0.00000000e+000, 0.00000000e+000, 7.33501604e-312, 0.00000000e+000, 5.72938864e-313, 4.94065646e-324, 7.33501739e-312, 7.33501604e-312, 7.33371324e-312, 7.42698527e-313, 0.00000000e+000, 0.00000000e+000, 1.50690022e-321, 0.00000000e+000, 7.85138443e-313, 4.94065646e-324, 7.33501740e-312, 5.92878775e-323, 7.33371322e-312, 9.54898106e-313, 0.00000000e+000, 0.00000000e+000, 1.50690022e-321, 0.00000000e+000, 9.97338022e-313, 4.94065646e-324, 7.33501740e-312, 5.92878775e-323, 7.33371324e-312, 1.16709769e-312, 0.00000000e+000, 0.00000000e+000, 7.33499531e-312, 0.00000000e+000, 1.20953760e-312, 4.94065646e-324, 7.33501741e-312, 7.33499531e-312, 7.33371324e-312, 1.37929726e-312, 0.00000000e+000, 0.00000000e+000, 7.33499531e-312, 0.00000000e+000, 1.42173718e-312, 4.94065646e-324, 7.33501741e-312, 7.33499531e-312, 7.33371324e-312, 1.59149684e-312, 0.00000000e+000, 0.00000000e+000, 3.18994064e+231, 0.00000000e+000, 1.63393676e-312, 5.87880625e+250, 7.33501741e-312, 1.77111852e+159, 7.33371323e-312, 1.80369642e-312, 8.97461399e+245, 0.00000000e+000, 5.77253125e+250, 0.00000000e+000, 1.84613634e-312, 1.62482249e+265, 7.33501741e-312, 1.42973900e+188, 7.33371324e-312, 2.01589600e-312, 1.72351640e+212, 0.00000000e+000, 1.72762649e+212, 0.00000000e+000, 2.05833592e-312, 3.33203517e+178, 7.33501742e-312, 7.09013607e+274, 7.33371324e-312, 2.22809558e-312, 4.13443852e-087, 0.00000000e+000, 1.53172818e-154, 0.00000000e+000, 2.27053550e-312, 4.85705098e+226, 7.33501742e-312, 5.84384734e+250, 1.52845066e-154, 5.88999540e+250, 7.42539480e+221, 7.70887102e-315])
七 eye()
根据指定边长和dtype创建单位矩阵。
arr=np.eye(10) arr
输出:
array([[1., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [0., 1., 0., 0., 0., 0., 0., 0., 0., 0.], [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 1., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0., 1., 0., 0., 0.], [0., 0., 0., 0., 0., 0., 0., 1., 0., 0.], [0., 0., 0., 0., 0., 0., 0., 0., 1., 0.], [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.]])
Part 2 :ndarray的数据类型
dtype(数据类型)是一个特殊的对象,它含有ndarray将一块内存解释为特定数据类型所需的信息。
In [3]: arr1 = np.array([1,2,3],dtype=np.float64) In [4]: arr2 = np.array([1,2,3],dtype=np.int32) In [5]: arr1.dtype Out[5]: dtype('float64') In [6]: arr2.dtype Out[6]: dtype('int32')
dtype是numpy如此强大和灵活的原因之一。多数情况下,他们直接映射到相应的机器表示,这使得‘读写磁盘上的二进制数据流’以及‘集成低级语言代码(如C,Fortran)’等工作边的更加简单。
你可以通过ndarray的astype方法显示的转换换其dtype
In [7]: arr = np.array([1,2,3,4]) In [8]: arr Out[8]: array([1, 2, 3, 4]) In [9]: arr.dtype Out[9]: dtype('int32') In [10]: arr1 = arr.astype(np.float64) In [11]: arr1.dtype Out[11]: dtype('float64')
注意:调用astype无论如何都会创造出一个新的 数组(原始数组的一份拷贝),即使新dtype跟苑dtype相同也是如此。
Part 3 :基本的索引和切片
In [12]: arr = np.arange(10) In [13]: arr Out[13]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) In [14]: arr[5] Out[14]: 5 In [15]: arr[5:8] Out[15]: array([5, 6, 7]) In [16]: s = arr[5:8]
In [19]: s Out[19]: array([5, 6, 7]) In [20]: s[1] = 55555 In [21]: s Out[21]: array([ 5, 55555, 7]) In [22]: arr Out[22]: array([ 0, 1, 2, 3, 4, 5, 55555, 7, 8, 9])
跟列表最重要的区别在于,数组切片是原始数组的视图。这意味着数据不会被复制,视图上的任何修改都会直接反应到原数组上。因为numpy的设计目的是处理大数据。
如果你想要得到一份副本而非视图。就需要显式的进行复制操作。
In [23]: arr = np.arange(10) In [24]: arr Out[24]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) In [25]: s = arr[5:8].copy() In [26]: s Out[26]: array([5, 6, 7]) In [27]: s[1] = 55555 In [28]: s Out[28]: array([ 5, 55555, 7]) In [29]: arr Out[29]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
补充
1 一维数组 转换 二维数组.。reshape方法
arr=np.array([1,2,3,4,5,6,7,8,9,10]).reshape((2,5)) arr
输出:
array([[ 1, 2, 3, 4, 5], [ 6, 7, 8, 9, 10]])
2 int类型数组 与 浮点型 数组之间的转换 。astype方法
arr=np.arange(10,dtype='int') arr
输出: 这是整型
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
直接调用astype()
arr.astype('float')
输出:
array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
3 索引
1 一维数组 arr[3]
2 二维数组
arr[3][3]
arr[3,3] 推荐这个方法。与下面切片联系紧密。
4 切片
array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]])
想取出下面数组,怎么办?
array([[ 6, 7], [11, 12]])
用推荐的索引稍加变动。
arr[1:3,1:3]
5 和列表不同的,数组的切片不是自动复制,对切片数组的修改会影响到原切片。
怎么办呢,加copy()方法