Numpy02——数据操作

Numpy 中的数组比 Python 原生中的数组(只支持整数类型与浮点类型)强大的一点就是它支持更多的数据类型。

基本数据类型

Numpy 常见的基本数据类型如下:

数据类型 描述
bool_ 布尔(True或False),存储为一个字节
int_ 默认整数类型(与C long相同;通常为int64int32
intc 与C int(通常为int32int64)相同
intp 用于索引的整数(与C ssize_t相同;通常为int32int64
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 半精度浮点:符号位,5位指数,10位尾数
float32 单精度浮点:符号位,8位指数,23位尾数
float64 双精度浮点:符号位,11位指数,52位尾数
complex_ complex128的简写。
complex64 复数,由两个32位浮点(实数和虚数分量)
complex128 复数,由两个64位浮点(实数和虚数分量)

以上这些数据类型都可以通过 np.bool_np.float32等方式访问。

这些类型都可以在创建 ndarray 时通过参数 dtype 来指定。

>>> a = np.arange(3, dtype=np.float16)
>>> a
array([ 0.,  1.,  2.])
>>> a.dtype
dtype('float16')

此外,在创建 ndarray 对象时,也可以通过字符代码来替换,主要是为了保持与较旧包(例如Numeric)的向后兼容性。

>>> np.array([1, 2, 3], dtype='f')
array([ 1.,  2.,  3.], dtype=float32)

但是不推荐使用这种字符代码的方式

类型转换

要转换数组的类型,请使用.astype()方法(首选)或类型本身作为函数。

>>> a
array([ 0.,  1.,  2.])
>>> a.astype(np.bool_)
array([False,  True,  True], dtype=bool)
>>> np.bool_(a)
array([False,  True,  True], dtype=bool)
------------------------------------------------------------------------------------

Numpy 中数组上的算术运算符使用元素级别最后的结果使用新的一个数组来返回。

>>> a = np.array( [20,30,40,50] )
>>> b = np.arange( 4 )
>>> b
array([0, 1, 2, 3])
>>> c = a-b
>>> c
array([20, 29, 38, 47])
>>> b**2
array([0, 1, 4, 9])
>>> a<35
array([ True, True, False, False], dtype=bool)

需要注意的是,乘法运算符*的运算在NumPy数组中也是元素级别的(这与许多矩阵语言不同)。如果想要执行矩阵乘积,可以使用dot函数:

>>> A = np.array( [[1,1], [0,1]] )
>>> B = np.array( [[2,0], [3,4]] )
>>> A
array([[1, 1],
       [0, 1]])
>>> B
array([[2, 0],
       [3, 4]])
>>> A*B                         # 元素乘积(elementwise product)
array([[2, 0],
       [0, 4]])
>>> A.dot(B)                    # 矩阵相乘(matrix product)
array([[5, 4],
       [3, 4]])
>>> np.dot(A, B)                # 矩阵相乘的另一种方式(another matrix product)
array([[5, 4],
       [3, 4]])

某些操作(如+=*=)可以修改现有数组,而不是创建新数组。

>>> a = np.ones((2,3), dtype=np.int32)
>>> b = np.random.random((2,3))
>>> a *= 3
>>> a
array([[3, 3, 3],
       [3, 3, 3]])
>>> a.dtype
dtype('int32')
>>> b.dtype
dtype('float64')
>>> b += a
>>> b
array([[ 3.42443069,  3.78421247,  3.46533145],
       [ 3.30761202,  3.1504406 ,  3.23310437]])
>>> a += b
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Cannot cast ufunc add output from dtype('float64') to dtype('int32') with casting rule 'same_kind'

当使用不同类型的数组操作时,结果数组的类型对应于更一般或更精确的数组(称为向上转换的行为)。由于定义 a时,数据类型指定为np.int32,而 a+b 生成的数据类型为 np.float64,所以自动转换出错。

(只能向更为精确的类型进行运算转换,不可逆)
1

发表评论

电子邮件地址不会被公开。 必填项已用*标注

微信扫一扫

微信扫一扫

微信扫一扫,分享到朋友圈

Numpy02——数据操作
嘿!有什么能帮到您的吗?
返回顶部

显示

忘记密码?

显示

显示

获取验证码

Close