生成ndarray
生成ndarray数组通常采用有三种方法:
- 使用array函数
- 使用zeros, ones来生成全0、全1数组
- 使用arange函数
接下来分别介绍:
1. array函数
array函数接受任意的序列型对象,生成一个新的包含传递数据的numpy数组。
另外,嵌套序列会自动转换成多维数组。
shape属性表征数组每一维度的数量
dtype属性描述数组的数据类型
import numpy as np
data1 = (1, 3, 3, 5)
data2 = [[1, 2, 3, 4],
[1, 2, 3, 3.0]]
arr1 = np.array(data1)
arr2 = np.array(data2)
print(arr1.shape, arr1.dtype) # (4, ) int32
print(arr2.shape, arr2.dtype) # (2, 4) float64
.
2.zeros, ones
给定形状和长度后,可以通过zeros、ones一次性创建全0、全1数组。
若想创建高维数组,则需要传入一个元组。
这种方法生成的数组默认数据类型为float64。
import numpy as np
data1 = np.zeros(4)
data2 = np.ones((3, 4))
print(data1)
# [0. 0. 0. 0.]
print(data2)
# [[1. 1. 1. 1.]
# [1. 1. 1. 1.]
# [1. 1. 1. 1.]]
.
3.arange函数
arange是python内建函数range的数组版。
这种方法生成的数组默认数据类型为int32。
import numpy as np
data3 = np.arange(5)
print(data3) # [0 1 2 3 4]
.
ndarray的数据类型
数据类型,即dtype,是一个特殊的对象,它包含了ndarray需要为某一种类型数据所申明的内存块信息(表示数据的数据)
可以在生成ndarray时候显式声明dtype。
import numpy as np
data = np.array([1, 2, 3], dtype=np.float64)
print(data) # [1. 2. 3.]
可以使用astype方法显式地转换数组的数据类型
import numpy as np
data = np.array(['12', '34', '56'])
print(data, data.dtype) # ['12' '34' '56'] <U2
float_data = data.astype(np.float64)
print(float_data) # [12. 34. 56.]
.
数组算术
numpy数组允许进行批量操作,任何两个同尺寸数组之间的算术都是逐元素操作
带有标量计算时,也是针对数组的每一个元素进行一遍操作
import numpy as np
data_np = np.array([1, 2, 3])
data_np_2 = np.array([0, 1, 5])
data_py = [1, 2, 3]
print(data_np * data_np) # [1 4 9]
print(1 / data_np) # [1. 0.5 0.33333333]
print(data_np > data_np_2) # [ True True False]
print(data_py * data_py)
# TypeError: can't multiply sequence by non-int of type 'list'
相反python数组就不能这样操作
.
数组切片
numpy数组的切片相比于python的内建列表,有一点不同
- 数组的切片是原数组的视图(而列表中是拷贝)。切片不是单纯数据的拷贝,任何对视图的修改都会反映到原数组上。
import numpy as np
data_np = np.array([1, 2, 3])
data_py = [1, 2, 3]
data_1 = data_np[0:2]
data_2 = data_py[0:2]
data_1[:] = 4
data_2[:] = 4 # TypeError: can only assign an iterable
print(data_np) # [4 4 3]
print(data_py) # [1, 2, 3]
如果想要一份数组切片的拷贝而不是一份视图,可以用浅拷贝的方法,如data_np[0:2].copy()
.
参考资料
《利用python进行数据分析》