《利用python进行数据分析》学习笔记--Numpy(1)

ndarray -----Numpy的N维数组对象

所以创建数组的话,首先想到的就是Numpy里面的array函数

1、创建ndarry-列表的转换

import numpy as np
data1 = [2,3,4,4.5,1]
arr1 = np.array(data1)
arr1
arr1.dtype
结果为
array([2. , 3. , 4. , 4.5, 1. ])
dtype('float64')

因此可以看到array函数会为新建的数组推断出一个比较合适的数据类型。

data2 = [[3,5,7,9],[2,4,6,8]]
arr2 = np.array(data2)
arr2
arr2.shape #数组的shape属性 ,本题中的为两行四列
arr2.ndim #数组的维度
结果为
array([[3, 5, 7, 9],
       [2, 4, 6, 8]])
(2, 4)
2

另外 zeros 和 ones 也可以创建指定长度的数组

默认均为浮点型数据,转换为其他类型(4,int)即可
np.zeros(10)
np.ones((3,6))
np.empty((2,3,2))#大多数情况下,返回的是一些未初始化的垃圾值

结果为

array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
array([[1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1.]])
array([[[1.06312567e-311, 2.47032823e-322],
        [0.00000000e+000, 0.00000000e+000],
        [8.48798316e-313, 2.46567317e+179]],

       [[5.89332333e-091, 1.68750157e-051],
        [8.26462072e-072, 3.83469119e+175],
        [3.99910963e+252, 2.90315913e-057]]])

一些其他的数组函数

asarray-----将输入数据转换为ndarray
arange-----返回数组形式的列表
ones_like----以另一个数组为参数,返回全1数组
zeros_like
empty_like

y = np.arange(3, dtype=float)
y
np.ones_like(y)
结果为
array([0., 1., 2.])
array([1., 1., 1.])

2、ndarray的数据类型

arr1 = np.array([2,3,4],dtype = np.float64)
arr1.dtype
返回为
dtype('float64')

可见,dtype能将含有array的一块内存解释为特定数据类型的功能。
数值型dtype的命名方式为:类型名(float,int)+表示元素位长的数字
数据类型还可以做一些转换(astype):

arr = np.array([1.2,-2.3,4.0])
arr.astype (np.int32)
结果为
array([ 1, -2,  4])

 调用astype,总会创建一个新的数组,即使新dtype和旧dtype相同

3、切片及索引

arr = np.arange(9)
arr[5]
arr[5:8]
返回为
5
array([5, 6, 7])

arr[5:8] = 10
arr
返回值为
array([ 0,  1,  2,  3,  4, 10, 10, 10,  8])
```
切片产生的数据作用在原始数组上,和列表不同,可通过arr[5:8].copy进行复制切片为副本。
arr = np.array([[[1,2,3],[4,5,6]], [[7,8,9],[10,11,12]]])
arr
返回值为
array([[[ 1,  2,  3],
        [ 4,  5,  6]],

       [[ 7,  8,  9],
        [10, 11, 12]]])

arr[0]
返回值为
array([[1, 2, 3],
       [4, 5, 6]])

arr[0]=25
arr
返回值为
array([[[25, 25, 25],
        [25, 25, 25]],

       [[ 7,  8,  9],
        [10, 11, 12]]])

arr[1,0,1]
返回值为
8

arr[1,:1]  
返回值为
array([[7, 8, 9]])
因此可见,:2 表示切割至第二轴,并且不包含第二轴
         1 :表示从第一轴开始切割,至最后

4、布尔型索引

可以将一组数据中的每个数据一一对应字符型数据,就会产生一个布尔型数组,同样也能够产生布尔型索引,举例如下

import numpy as np
names = np.array(['ming','hong','gang'})
data = randn(3,3)
name
data
返回值为
array(['ming', 'hong', 'gang'], dtype='<U4')
array([[-1.85959055,  1.75769342, -1.39259477],
       [-0.86781481, -0.04533248, -0.09520978],
       [-0.22062221, -0.47521222,  0.14313158]])
数组同样也可以进行比较运算,并且是矢量化的
names == 'ming'
返回为
array([ True, False, False])
这个布尔型数组还可以用于数组索引
data[names == 'ming']
返回为
array([[-1.85959055,  1.75769342, -1.39259477]])

data[names == 'ming',2]
返回为
array(-1.39259477)

还有其他的运算效果,其中包括,不等于(!=),或用负号进行否定;
以及多个布尔条件,和(&),或(|)

5、花式索引——Fancy indexing
利用整数数组进行索引

arr = np.arange(32).reshape((8,4))
arr
返回为
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15],
       [16, 17, 18, 19],
       [20, 21, 22, 23], 
       [24, 25, 26, 27],
       [28, 29, 30, 31]])
输入
arr[[1,3,5,6],[0,2,1,3]]
返回为
array([ 4, 14, 21, 27])

可以发现返回值为(1,0)(3,2)(5,1)(6,3)
会与我们所想的不一样,应该返回的是矩阵的子集,依然为矩阵

arr[np.ix_([1,3,5,6],[0,2,1,3])]
返回为
array([[ 4,  6,  5,  7],
       [12, 14, 13, 15],
       [20, 22, 21, 23],
       [24, 26, 25, 27]])

6、数组转置和轴对换
数组转置用.T

arr = np.arange(6).reshape((2,3))
arr
arr.T
返回为
array([[0, 1, 2],
       [3, 4, 5]])
array([[0, 3],
       [1, 4],
       [2, 5]])

 

posted @ 2018-08-26 10:33  积水聚沙  阅读(285)  评论(0编辑  收藏  举报