Numpy
ndarray
numpy的最重要特点就是其N维数组对象(ndarray)。
ndarray的可以对整块数据执行数学运算,语法与标量元素的元素的运算一致。
如:
import numpy as np
x = array([[-0.50043612, -1.99790499, 0.66098891, 0.26490388],
[-1.02531769, 0.50054972, -1.30755871, 1.53881345]])
x + x #相加
Out[10]:
array([[-1.00087224, -3.99580998, 1.32197782, 0.52980775],
[-2.05063538, 1.00109944, -2.61511741, 3.0776269 ]])
x * 10 #乘以标量
Out[11]:
array([[ -5.0043612 , -19.97904992, 6.60988909, 2.64903877],
[-10.25317691, 5.00549718, -13.07558707, 15.38813451]])
1 / x #1/x被除
Out[5]:
array([[-1.99825704, -0.5005243 , 1.51288469, 3.77495415],
[-0.97530747, 1.99780353, -0.76478401, 0.64985135]])
x - x #相减
Out[12]:
array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
- shape查询数组维度
- ndim数组的维数
- dtype查询数组数据类型
x.shape
Out[13]: (2, 4) # 2行4列
x.ndim
Out[15]: 2 # 2维
x.dtype
Out[14]: dtype('float64') #数据类型
创建ndarray
1. array函数
将输入数据(列表,元组,数组,或其他),转换为ndarray
y = list(range(1,11)) #如果直接输入y = range(1,11),会返回一个迭代器。
y
Out[33]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
arr1 = np.array(y)
arr1
Out[35]: array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
z = [[1, 2, 3, 4],[5, 6, 7, 8]]# 生成一个嵌套序列(一组等长列表组成的列表)
arr2 = np.array(z)
arr2
Out[44]:
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
2. asarray函数
将输入转换为ndarray,若本身是ndarray则不复制。
3. arange函数
arange()
是python内置函数range()
的数组版。
arange()
生成一个一维数组,range
生成列表。
np.arange(11) #可对比上文的range理解。
Out[45]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
4. ones,ones_like函数
这里必须说明一下,如果ndarray没有指定数据类型,则默认为float64(浮点数)。
ones
根据指定的形状和dtype创建一个全1数组。
ones_like
以另一个数组为参数,并根据其形状和dtype创建一个全1数组。
np.ones(2) #默认一维
Out[46]: array([ 1., 1.])
np.ones((2,3))
Out[47]:
array([[ 1., 1., 1.],
[ 1., 1., 1.]])
np.ones(3,dtype = np.int32) # 指定数据类型
Out[51]: array([1, 1, 1])
np.ones_like(arr2) #以arr2为参数
Out[54]:
array([[1, 1, 1, 1],
[1, 1, 1, 1]])
5. zeros,zeros_like函数
类似与ones
,ones_like
,但是创建的是全0数组。
6. empty,empty_like函数
创建新数组,分配内存空间,但不填充任何值。
np.empty(2)
Out[56]: array([ 0., 0.])
np.empty((2,4)) #2 * 4
Out[57]:
array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
np.empty_like(arr2) #以arr2为参数
Out[60]:
array([[0, 0, 0, 0],
[0, 0, 0, 0]])
看到这里你是不是以为np.empty
会返回全0数组?
其实不是的。
np.empty((3,3,2)) # 3维数组
Out[58]:
array([[[ 6.23042070e-307, 4.67296746e-307],
[ 1.69121096e-306, 1.33512376e-306],
[ 1.33511562e-306, 1.11256817e-306]],
[[ 1.06811422e-306, 1.42417221e-306],
[ 1.11260619e-306, 8.90094053e-307],
[ 1.86919378e-306, 1.06809792e-306]],
[[ 1.37962456e-306, 1.69111861e-306],
[ 1.78020169e-306, 1.37961777e-306],
[ 7.56599807e-307, 2.56761491e-312]]])
7. eye,identity函数
返回一个N介单位矩阵。
np.eye(5) # 创建5介单位阵
Out[61]:
array([[ 1., 0., 0., 0., 0.],
[ 0., 1., 0., 0., 0.],
[ 0., 0., 1., 0., 0.],
[ 0., 0., 0., 1., 0.],
[ 0., 0., 0., 0., 1.]])
np.identity(5) #创建5介单位阵
Out[63]:
array([[ 1., 0., 0., 0., 0.],
[ 0., 1., 0., 0., 0.],
[ 0., 0., 1., 0., 0.],
[ 0., 0., 0., 1., 0.],
[ 0., 0., 0., 0., 1.]])
eye(N, M = None, k = 0,dtype =float)
第一个参数N = 行数。
第二个参数 M = 列数,省略代表M = N 。
第三个参数 k 代表对角线位置, = 0 代表主对角线, +1就向右上方偏移1, -1 就向左下角偏移1。
第四个参数表示类型 dtype 默认为 float 类型。
np.eye(4,k = 1) #向上偏移
Out[69]:
array([[ 0., 1., 0., 0.],
[ 0., 0., 1., 0.],
[ 0., 0., 0., 1.],
[ 0., 0., 0., 0.]])
np.eye(4,k = -1) #向下偏移
Out[70]:
array([[ 0., 0., 0., 0.],
[ 1., 0., 0., 0.],
[ 0., 1., 0., 0.],
[ 0., 0., 1., 0.]])
np.eye(4,8) #给定M
Out[67]:
array([[ 1., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 1., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 1., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 1., 0., 0., 0., 0.]])
ndarray的数据类型
numpy所支持的数据类型如下:
数据类型 | 描述 |
---|---|
bool_ | 以字节存储的布尔值(True 或 False) |
int_ | 默认的整数类型(和 C 的 long 一样,是 int64 或者 int32) |
intc | 和 C 的 int 相同(一般为 int64 或 int32) |
intp | 用于下标的整数(和 C 的 ssize_t 相同,一般为int64 或者 int32) |
int8 | 字节(-128 到 127) |
int16 | 整数(-32768 到 32767) |
int32 | 整数(-2147483648 到 2147483647) |
int64 | 整数(-9223372036854775808 到 9223372036854775807) |
uint8 | 无符号整数(0 到 255) |
uint16 | 无符号整数(0 到 65535) |
uint32 | 无符号整数(0 到 4294967295) |
uint64 | 无符号整数(0 到 18446744073709551615) |
float_ | float64 的简写 |
float16 | 半精度浮点:1位符号,5位指数,10位尾数 |
float32 | 单精度浮点:1位符号,8位指数,23位尾数 |
float64 | 双精度浮点:1位符号,11位指数,52位尾数 |
complex_ | complex128 的简写 |
complex64 | 由两个32位浮点(实部和虚部)组成的复数 |
complex128 | 由两个64位浮点(实部和虚部)组成的复数 |
string_ | 固定长度的字符创类型(每个字符一个字节) |
很难记住这些numpy的dtype。我们只需要控制存储类型即可。
arr1 = np.array([1, 2, 3],np.int32)
arr2 = np.array([2,3,4],dtype = np.float64)
arr1.dtype
Out[14]: dtype('int32')
arr2.dtype
Out[11]: dtype('float64')
.astype()
方法可以显式的转换为dtype。
float_arr1 = arr1.astype(np.float64) #整型转换为浮点型
float_arr1.dtype
Out[16]: dtype('float64')
float_arr1
Out[17]: array([ 1., 2., 3.])
浮点型转换为整型,只保留整数部分。
arr3 = np.array([2.3, -1.32, -5.9, 4.8])
arr3
Out[25]: array([ 2.3 , -1.32, -5.9 , 4.8 ])
arr3.astype(np.int32)#转换为整数
Out[26]: array([ 2, -1, -5, 4]) #可看到小数部分被丢弃了
有时某个字符串不能被转换为float64,就会引发TypeError
,因此,我们可以懒一点,
像下面这样写:
n_strings = np.array(['1.23','-9.6','23'],dtype = np.string_)
n_strings.astype(np.float)
Out[32]: array([ 1.25656565, -9.6 , 23. ])
n_strings.astype(np.float64)
Out[30]: array([ 1.25656565, -9.6 , 23. ])
n_strings
Out[35]:
array([b'1.256565653', b'-9.6', b'23'],
dtype='|S11')
可以看到这两种结果一致。
numpy会将其数据类型映射到等价的dtype上。
可以发现,使用.astype()
新创建了一个数组(原数组的一种拷贝),即使,与原来数据类型一致也会如此。