Numpy入门[4]——数组类型
参考:
https://ailearning.apachecn.org/
使用Jupyter进行练习
import numpy as np
之前已经看过整数数组和布尔数组,除此之外还有浮点数数组和复数数组。
复数数组
a = np.array([1 + 1j , 2 , 3 , 4])
a
array([1.+1.j, 2.+0.j, 3.+0.j, 4.+0.j])
a.dtype
dtype('complex128')
对于复数我们可以查看它的实部和虚部:
a.real
array([1., 2., 3., 4.])
a.imag
array([1., 0., 0., 0.])
还可以设置它们的值:
a.imag=[1, 2, 3, 4]
a
array([1.+1.j, 2.+2.j, 3.+3.j, 4.+4.j])
查看复共轭:
a.conj()
array([1.-1.j, 2.-2.j, 3.-3.j, 4.-4.j])
这些属性方法可以用在浮点数或者整数数组上:
b = np.array([0.0, 1, 2, 3])
b.dtype
dtype('float64')
b.real
array([0., 1., 2., 3.])
b.imag
array([0., 0., 0., 0.])
# 这里,虚部是只读的,并不能修改它的值:
b.conj()
array([0., 1., 2., 3.])
指定数组类型
构建数组的时候,数组会根据传入的内容自动判断类型:
a = np.array([0, 1.0, 2, 3])
# 对于浮点数,默认为双精度:
a.dtype
dtype('float64')
也可以在构建的时候指定类型:
b = np.array([0,1.0,2,3],
dtype=np.float32)
b.dtype
dtype('float32')
除此之外,还可以指定有无符号,例如无符号整数:
c = np.array([0,1,2,3],
dtype=np.uint8)
c.dtype
dtype('uint8')
uint8 只使用一个字节,表示 0 到 255 的整数。
Numpy类型
具体如下:
任意类型的数组:
e = np.array([1,1.2,'hello', [10,20,30]],
dtype=object)
e
array([1, 1.2, 'hello', list([10, 20, 30])], dtype=object)
# 乘法
a * 2
array([0., 2., 4., 6.])
类型转换
原始数组
origin= np.array([1.5, -3],
dtype=np.float32)
origin
array([ 1.5, -3. ], dtype=float32)
asarray函数
np.asarray(origin, dtype=np.float64)
array([ 1.5, -3. ])
np.asarray(origin,dtype=np.uint8)
array([ 1, 253], dtype=uint8)
asarray不会修改原来数组的值
origin
array([ 1.5, -3. ], dtype=float32)
当类型相同的时候,asarray 并不会产生新的对象,而是使用同一个引用。
这么做的好处在与,asarray 不仅可以作用于数组,还可以将其他类型转化为数组。
有些时候为了保证输入值是数组,需要将其使用 asarray 转化,当它已经是数组的时候,并不会产生新的对象,这样保证了效率。
astype方法
astype
方法返回一个新数组:
origin.astype(np.float64)
array([ 1.5, -3. ])
origin.astype(np.uint8)
array([ 1, 253], dtype=uint8)
astype也不会改变原来数组的值:
origin
array([ 1.5, -3. ], dtype=float32)
另外,astype 总是返回原来数组的一份复制,即使转换的类型是相同的:
change = origin.astype(np.float32)
origin is change
False
view方法
a = np.array([1,2,3,4],dtype=np.int32)
a
array([1, 2, 3, 4])
view
会将 a
在内存中的表示看成是 uint8
进行解析:
b = a.view(np.uint8)
b
array([1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0], dtype=uint8)
a[0] = 258
a
array([258, 2, 3, 4])
修改 a 会修改 b 的值,因为共用一块内存:
b
array([2, 1, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0], dtype=uint8)