一、生成ndarray
array函数。array函数可以接受任意的序列型对象,生成一个新的包含传递数据的Numpy数组。
data1 = [6, 7.5, 8, 0, -1 ]
arr1 = np.array(data1)
嵌套序列,例如同等长度的列表,将会自动转化成多维数组。
data2 = [[1, 2, 3, 4], [5, 6, 7, 8]]
arr2 = np.array(data2)
ndim和shape属性来检查数组的维度。(其中ndim是求数组的维度,shape返回的是数组的形状)
dtype中。
其中需要注意的是: int32 -> float64 是完全可以的。 float64 -> int32 会将小数部分截断。 string -> float64 如果字符串数组表示的全是数字,也可以转化。
以下都是数组生成函数:
array : 将输入数据(可以是列表,元祖,数组以及其他序列)转化为ndarray,如果不显式指定数据类型,将自动推断;默认复制所有的输入数据。
asarray: 将输入转化为ndarray,但如果输入已经是ndarray则不再复制。
np.arange: Python内建函数range的数组版,返回一个数组。
ones: 根据给定的形状和数据类型生成全1数组。
ones_like: 根据所给定的数组生成一个形状完全一样的全1数组。
zeros: 根据所给定形状和数据类型生成一个形状一样的全0数组。
zeros_like: 根据所给定的数组生成一个形状完全一样的全0数组。
empty: 根据给定形状生成一个没有初始化数值的空数组。
empty_like: 根据所给定的数组生成一个形状完全一样但没有初始化的空数组。
full: 根据所给定的形状和数据类型生成指定数值的数组。
full_like: 根据所给的数组生成一个形状一样但内容是指定数值的数组。
eye, identity: 生成一个N*N特征矩阵(对角线位置都是1,其余位置都是0)
二、ndarray 的数据类型
Numpy数据类型
类型 | 类型代码 | 描述 |
int8, uint8 | i1, u1 | 有符号和无符号的8位整数 |
int16, uint16 | i2, u2 | 有符号和无符号的16位整数 |
int32, uing32 | i4, u4 | 有符号和无符号的32位整数 |
int64, uint64 | i8, u8 | 有符号和无符号的64位整数 |
float16 | f2 | 半精度浮点数 |
float32 | f4或f | 标准单精度浮点数;兼容C语言float |
float64 | f8或d | 标准双精度浮点数;兼容C语言double和Python float |
float128 | f16或g | 拓展精度浮点数 |
complex64 | c8, | 基于32位浮点数的复数 |
complex128 | c16 | 基于64位浮点数的复数 |
complex256 | c32 | 基于128位浮点数的复数 |
bool | ? | 布尔值,存储True或False |
object | O | Python object类型 |
string_ | S | 修正的ASC II 字符串类型,例如生成一个长度为10的字符串类型,使用“S10” |
unicode_ | U | 修正的Unicode类型,生成一个长度为10的Unicode类型使用“U10" |
astype方法显式地转化数组的数据类型:
arr = np.array([1, 2, 3, 4, 5])
float_arr = arr.astype(np.float64)
三、Numpy 数组算术
数组之所以重要是因为它批量操作而无须任何for循环。Numpy用户称这种特征为向量化。任何在两个等尺寸数组之间的算术操作都应用了逐元素操作的方式。带有标量(零维张量)计算的算术操作,会把计算参数传递给数组的每一个元素。同尺寸数组之间的比较,会产生一个布尔值数组。
实例代码:
四、基础索引与切片
如果你还是想要一份数组切片的拷贝而不是一份视图的话,你就必须显式地复制这个数组,例如arr[5:8].copy().
arr = np.arange(10)
#arr ->array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
#arr[5:8]为array([5, 6, 7])
#b = 5
arr[5:8] = 12
#此时arr为array([0, 1, 2, 3, 4, 12, 12, 12, 8, 9])
在二维的数组,每个索引值对应的元素不再是一个值,而是一个一维数组,因此,单个元素可以通过递归的方式获得。
arr2d = np.array ([1, 2, 3], [4, 5, 6], [7, 8, 9])
#arr2d[2]为array([7, 8, 9])
在多维数组中,你可以省略后续索引值,返回的对象将是降低一个维度的数组。
arr3d = np.array([[[1, 2, 3],[4, 5, 6]],[[7, 8, 9], [10, 11, 12]]])
#arr3d[0]为 array([[1, 2, 3], [4, 5, 6]])
切片操作与Python列表类似:
五、布尔索引
使用numpy/.random.randn()函数来生成一些随机正太分布的数据:
布尔值数组的长度必须和数组轴索引长度一致。使用布尔值索引选择数据是,总是生成数据的拷贝,即使返回的数组没有并没有任何变化。python的关键字 and 和 or 对布尔值数组并没有用,使用& |来代替。
六、神奇索引
用于描述使用整数数组进行数据索引。神奇索引与切片不同,它总是将数据复制到一个新的数组中。
arr = np.empty((8, 4))
for i in range(8):
arr[i] = i
#arr为array([[0., 0., 0., 0.],
# [1., 1., 1., 1.],
# [2., 2., 2., 2.].
# [3., 3., 3., 3.],
# [4., 4., 4., 4.],
# [5., 5., 5., 5.],
# [6., 6., 6., 6.],
# [7., 7., 7., 7.]])
arr1 = arr[[4, 3, 0, 6]]
#arr1为array([[4., 4., 4., 4.],
# [3., 3., 3., 3.],
# [0., 0., 0., 0.],
# [6., 6., 6., 6.]])
#如果使用负的索引将从尾部进行选择
七、数组转置和换轴
T属性可以转置数组。
arr = np.arange(15).reshape((3, 5))
arr.T
矩阵计算时,你可能会经常进行一些特定操作,内积.dot;
arr = np.random.randn(6, 3)
np.dot(arr.T, arr)
对于更高维的数组,transpose方法可以接收包含轴编号的元组,用于置换轴
在这里,轴已经被重新排序,使得原先的第二个轴变为第一个,原先的第一个轴变成了第二个,最后一个轴并没有改变。
.T进行转置是换轴的一个特殊案例。ndarray有一个swapaxes方法,改方法接收一对轴编号作为参数,并对轴进行调整用于重组数据。swapaxes返回的是数据的视图,而没有对数据进行复制。