1.Numpy数组的创建
1.1 手动创建
1.创建一维数组
a = np.array([2, 5, 1, 4, 3, 9, 8])
2.创建二维数组
a = np.array([[2, 5, 1, 4, 3, 9, 8],[2,3,4,5,6,1,3]])
3.更高维数组以此类推
。。。。。。
1.2利用函数的创建
numpy拥有丰富的函数用于创建各式各样的多维数组,例如全0数组,全1数组,服从正态分布的数组等。
1.利用函数创建全0或者全1数组
a = np.zeros(10)
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
b = np.zeros(shape=(2,3))
[[ 0. 0. 0.]
[ 0. 0. 0.]]
c = np.ones(shape=(2,4))
[[ 1. 1. 1. 1.]
[ 1. 1. 1. 1.]]
2.生成空的数组(内部的值是随机初始化的值),不建议使用。
d = np.empty(shap=(2,3))
[[ 1.32971156e-152 2.45883933e+198 2.31634004e-152]
[ 2.21705231e+068 2.45886150e+198 -5.68511526e-310]]
3.生成正态分布的数组(数组里面的所有元素服从正态分布)
b = np.random.normal(size=(10,2,4))
numpy.random模块对python内置的random进行了补充,增加了一些用于高效生成多种概率分布的样本生成函数。
4.创建元素有序增减的数组
a = np.arange(1, 10, 0.5)
[ 1. 1.5 2. 2.5 3. 3.5 4. 4.5 5. 5.5 6. 6.5 7. 7.5 8. 8.5 9. 9.5]
1:指定起始值(能够取到)、10:终止值(取不到),0.5:步长。区间遵守左必又开原则。
如果要生成这样的数组呢?
[[ 0 1 2 3 4 5]
[10 11 12 13 14 15]
[20 21 22 23 24 25]
[30 31 32 33 34 35]
[40 41 42 43 44 45]
[50 51 52 53 54 55]]
可以用以下的的方式:
a = np.arange(0, 60, 10)#1
b = np.arange(6)#2
c = a.reshape((-1, 1))#3
d = c + b #4
a: [ 0 10 20 30 40 50]
b: [ 0 1 2 3 4 5]
c:
[[ 0]
[10]
[20]
[30]
[40]
[50]]
c + b利用广播机制,得到的上述数组。
说明:reshape方法,可以创建改变了尺寸的新数组,原数组的shape保持不变,如果使用a.shape = (-1,1)不会得到新副本。例如从(3,4)改为(4,3)并不是对数组进行转置,而只是改变每个轴的大小,数组元素在内存中的位置并没有改变
2.Numpy数组的切片
需要注意的是,通过切片得到的数组是原数组的一个视图,与原数组共享内容空间,如果直接修改切片数组,会影响原数组。
A = np.array([0, 1, 2])
a = A[0:1]
a[0] = 5
print(A)
#########
[5 1 2]
2.1读取一个元素
1维数组a[i]
2维数据a[i][j]
以此类推……
2.2读取一行中第x到第y的数据,或者跳着读,或者反着读
2.2.1a是一维数组
a[x:y] #第y是读不到的,左闭又开
a[:y] #从0到y的数据
a[x:y:step] #step为读取步长
2.2.2读取特定一行,a为二维数组
a[i] # 读取第i行
2.2.3读取特定的几行(如第0行,第2行,第3行)
a[[0,2,3]]
#如果行标是连续的,可以直接写成
a[x:y]
2.2.4读取数组中某一区域的数组,比如第1-2行,2-3列的数据
a[1:3,[2,3]],
但是如果是这样的话,a[[0, 1, 2], [2, 3, 4]],读取的数据为a[0][2],a[1][3],a[2][4].可以再研究一下。
2.2.5读取特定一列(几列),a为二维数组
1.先将a转置,a.T
2.在读取第0行a.T[0](也就是一开始的第0列。
或者a[:,1] 取出第1列
2.2.6选出数组中大(小,等)于某个值的所有元素
#a为一维数组
a = np.random.rand(10)
print a > 0.5 # 得到 [False True False True True False True True False False]
如果a是二维数组,则返回一个二维的bool数组。
a[a>0.5] # 得到a中大于0.5的数据
#a为二维数组,按某列的值得大小,得到一整行
步骤大概是,1将a转置,取出对应的行(也就是原始的列),通过遍历得到True的下标,然后用下标取出原始数组对应的行。
#####利用for循环对numpy进行遍历
a = np.arange(15).reshape(5,-1)
for i in a: #得到第i行
for j in i: # 得到第i行中,第j个元素
print j
3.元素去重
3.1一维数组元素去重
直接使用库函数unique
a = np.array((1, 2, 3, 4, 5, 5, 7, 3, 2, 2, 8, 8))
b = np.unique(a)
a:[1 2 3 4 5 5 7 3 2 2 8 8]
b:[1 2 3 4 5 7 8]
3.2二维数组元素去重
如果直接使用unique二维数组的去重,结果就会变成如下这个样子。
c = np.array(((1, 2), (3, 4), (5, 6), (1, 3), (3, 4), (7, 6)))
np.unique(c)
#############
[1 2 3 4 5 6 7]
方案一:转化为虚数
r, i = np.split(c, (1, ), axis=1)
x = r + i * 1j
x = c[:, 0] + c[:, 1] * 1j
print ‘转换成虚数:’, x
print ‘虚数去重后:’, np.unique(x)
print np.unique(x, return_index=True) # 思考return_index的意义
idx = np.unique(x, return_index=True)[1]
方案二:利用set
np.array(list(set([tuple(t) for t in c])))
3.2 一维数组重复元素统计
利用pandas的顶级函数value_counts()
b = np.array([1,1,2,2,4,4])
print(pd.value_counts(b))
4 2
2 2
1 2
此方法返回的是series对象