Python数据科学-Numpy 02 ndarray

阅读 41

2021-09-28

1 创建

import numpy as np

a = np.array([1,2,3,4])
b = np.array((5,6,7,8))
c = np.array([[1,2,3,4],[4,5,6,7],[7,8,9,10]])

print('a=',a)
print('b=',b)
print('c=',c)

结果:

  • 数组的形状可以通过其shape属性获取
print('a.shape=', a.shape)
print('b.shape=', b.shape)
print('c.shape=', c.shape)

结果:

  • 变更数组形状
c.shape = (4,3)
print('c=',c)

结果:

  • 自动计算形状(某一个纬度形状为-1时,由其他纬度来推断此纬度的值)
c.shape=(2,-1)
print('c=',c)

结果:

  • 创建新的形状,而不影响现在的形状
d = a.reshape(2, 2)
print('d=', d)
print('a=', a)

结果:

  • 此时a和d共享数据,改变其中一个,另外一个也同时改变
a[1]=100
print('d=', d)
print('a=', a)

2 元素类型

  • 数组的元素类型可以通过dtype属性获取。
c.dtype

结果:
dtype('int64')

  • 通过dtype参数可以在创建数组时指定元素类型
ai32 = np.array([1,2,3,4], dtype=np.int32)
af = np.array([1,2,3,4], dtype=float)
ac = np.array([1,2,3,4], dtype=complex)
print('ai32=%s, dtype=%s' % (ai32,ai32.dtype))
print('af=%s, dtype=%s' % (af,af.dtype))
print('ac=%s, dtype=%s' % (ac,ac.dtype))

结果:

  • Numpy支持的数据类型


NumPy中的每个数值类型都有几种字符串表示方式,字符串和类型之间的对应关系都存储在typeDict字典中。

set(np.typeDict.values())
dict(np.typeDict.items())

结果:

2.1 数据类型对象 (dtype)

数据类型对象是用来描述与数组对应的内存区域如何使用,这依赖如下几个方面:

  • 数据的类型(整数,浮点数或者 Python 对象)
  • 数据的大小(例如, 整数使用多少个字节存储)
  • 数据的字节顺序(小端法或大端法)
  • 在结构化类型的情况下,字段的名称、每个字段的数据类型和每个字段所取的内存块的部分
  • 如果数据类型是子数组,它的形状和数据类型

字节顺序是通过对数据类型预先设定"<“或”>“来决定的。”<“意味着小端法(最小值存储在最小的地址,即低位组放在最前面)。”>"意味着大端法(最重要的字节存储在最小的地址,即高位组放在最前面)。

dtype 对象是使用以下语法构造的:numpy.dtype(object, align, copy)

  • object - 要转换为的数据类型对象
  • align - 如果为 true,填充字段使其类似 C 的结构体。
  • copy - 复制 dtype 对象 ,如果为 false,则是对内置数据类型对象的引用
import numpy as np
# 使用标量类型
dt = np.dtype(np.int32)
print(dt)
# int8, int16, int32, int64 四种数据类型可以使用字符串 'i1', 'i2','i4','i8' 代替
dt1 = np.dtype('i4')
print(dt1)
# 字节顺序标注
dt2 = np.dtype('<i4')
print(dt2)

# 首先创建结构化数据类型
dt3 = np.dtype([('age',np.int8)]) 
print(dt3)
# 将数据类型应用于 ndarray 对象
a = np.array([(10,),(20,),(30,)], dtype = dt3) 
print('a=%s, dtype=%s' % (a,a.dtype))
# 类型字段名可以用于存取实际的 age 列
print('a=%s' % a['age'])

2.1.1 示例

下面的示例定义一个结构化数据类型 student,包含字符串字段 name,整数字段 age,及浮点字段 marks,并将这个 dtype 应用到 ndarray 对象。

import numpy as np
student = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')]) 
a = np.array([('abc', 21, 50),('xyz', 18, 75)], dtype = student) 
print(a)

2.2 数值计算

通 过NumPy的数值类型也可以创建数值对象,下面创建一个16位的符号整数对象,它与Python的整数对象不同的是,它的収值范围有限,因此计算200*200会溢出,得到一个负数,这一点与C 语言的16位整数的结果相同:


Numpy的数值对象的运兑速度比Python的内置类型的运兑速度慢很多,如果程序中耑要大量地对单个数值运兑,应当尽量避免使用Numpy的数值对象。


2.3 数据类型转换

使用astype()方法可以对数组的元素类型进行转换,下面将浮点数数组t l 转换为32位整数
数组,将双精度的复数数组12转换成单精度的复数数组:

tl = np.array([l, 2 , 3, A], dtype=np.float)
t2 = np.array([1, 2, 3, 4], dtype=np.complex)
t3 = tl.astype(np.int32)
t4 = t2.astype(np.complex64)

3 自动创建

除了1节中,通过创建序列后,在使用array函数可以创建ndarray对象。也可以直接使用下列函数直接创建。

3.1 通过指定数值范围创建

numpy提供了类似于内置函数range(),通过指定数值范围来创建数组的函数。以arange()为例:

b = np.arange(1,4,1)
print(b)
print(type(b))

结果:

具体函数:

函数 说明 示例
arange() 指定开始值、终值和步长来创建表示等差数列的一维数组,注意所得到的结果中不包含终值。 np.arange(1,4,1)
linspace() 通过指定幵始值、终值和元素个数来创建表示等差数列的一维数组,可以通过endpoint参数指定是否包含终值,默认值为True,即包含终值。 np.linspace(1,8,7,endpoint=False)
logspace() linspace()类似,不过它所创建的数组是等比数列。基数可以通过base参数指定,其默认值为10。 np.logspace(0,1,12,base=2,endpoint=False)

3.2 通过指定形状和类型来创建

zeros()、 ones()、 empty()、full()等可以创建指定形状和类型的数组。以empty举例:

import numpy as np
# 创建一个形状为(2,3)、元素类型为整数的数组,注意其中的元素值没有被初始化
a = np.empty((2,3),np.int32)
print(a)

结果:

具体函数说明:

函数 说明 示例
empty() 只分配数组所使用的内存,不对数组元素进行初始化操作,因此它的运行速度是最快的。 np.empty((2,3),np.int32)
zeros() 将数组元素初始化为0 np.zeros((2,3),np.int32)
ones() 将数组元素初始化为1 np.ones((2,3),np.int32)
full() 将数组元素初始化为指定的值 np.full((2,3),np.pi)
zeros_like()
ones_like()
empty_like()
full_like()

3.3 通知指定字符串等来创建

精彩评论(0)

0 0 举报