numpy数组

1. numpy数组

1.1 创建数组

1.1.1 创建一维数组

import numpy as np
a = np.array( [1,2,3,4,5] )
print(a)
print(a.dtype)
print(a.shape)

[1 2 3 4 5]
int32
(5,)

a = np.arange(5)
print(a)

[0 1 2 3 4]

1.1.2 创建多维数组

m = np.array( [[1,2], [3,4]] )
print( m )
print(m.shape)
print(m.dtype)

[[1 2]
[3 4]]
(2, 2)
int32

m = np.array([np.arange(2), np.arange(2)])
print(m)

[[0 1]
[0 1]]

#创建特殊的数组: zeros, empty, ones, full, zeors_like, empty_like, ones_like, full_like

print( np.zeros(10) )          # 创建全0数组

[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

print( np.zeros((3, 6)) )      # 创建多维全0数组

[[0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0.]]

print( np.empty((2, 3, 2)) )   # 创建空数组, 不初始化数据

[[[1.50671562e-312 0.00000000e+000]
[2.26839301e+161 2.89847616e+131]
[6.02182527e+151 9.30537465e+199]]

[[2.20835466e-094 9.78750380e+199]
[6.97843734e+252 8.76739361e+252]
[2.15895723e+227 4.05173898e-317]]]

print( np.ones((3, 3)) )       # 创建全1数组

[[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]

print( np.full((3,3), 250))    # 创建数组,全部填充为250

[[250 250 250]
[250 250 250]
[250 250 250]]

1.1.3 数组的属性

b = np.arange(24).reshape(2,12)
print( b.dtype )        # 元素的数据类型
print( b.ndim )         # 维度
print( b.size )         # 大小
print( b.itemsize )     # 每个元素大小
print( b.nbytes )       # 数组大小

int32
2
24
4
96

b = np.array([ 1.+1.j,  3.+2.j])
print( b.real )         # 实部
print( b.imag )         # 虚部

[1. 3.]
[1. 2.]

1.1.4 数组的转换

b = np.array([1, 3])
print( b )

[1 3]

print( b.tolist() )         # 转成python列表

[1, 3]

print( b.tostring() )       # 转成字符串
print( np.frombuffer(b'\x01\x00\x00\x00\x03\x00\x00\x00', dtype=int) )   # 转成数组
print( np.frombuffer(b'\x01\x00\x00\x00\x03\x00\x00\x00', dtype=np.int8) )   # 转成数组, 按每个字节

b'\x01\x00\x00\x00\x03\x00\x00\x00'
[1 3]
[1 0 0 0 3 0 0 0]

c = b.astype(str)           # 转成字符串数组
print( c )                  
print( c.astype(int) )      # 转回int数组

['1' '3']
[1 3]

print( np.fromstring('1:2:3:4', sep=':', dtype=int) )       # 从字符串中以分割符转换数组

[1 2 3 4]

1.2 选择数组元素

a = np.array([[1,2],[3,4]])
print(a)

[[1 2]
[3 4]]

print(a[0,0])
print(a[0,1])
print(a[1,0])
print(a[1,1])

1
2
3
4

1.3 数据类型

1.3.1 基本数据类型

print(np.float64(42))

42.0

print(np.int8(42.0))

42

print(np.bool(42))

True

print(np.bool(0))

False

print( np.bool(42.0))

True

print(np.float(True))

1.0

print(np.float(False))

0.0

print( np.arange(7, dtype=np.uint16) )

[0 1 2 3 4 5 6]

# 产生TypeError异常 can't convert complex to float
import traceback

try:
    print(np.float(42.0 + 1.j))  
except TypeError:    
    print('Type Error')

Type Error

1.3.2 数据类型转换

arr = np.array([1, 2, 3, 4, 5])
print(arr.dtype, arr)
float_arr = arr.astype(np.float64)
print(float_arr.dtype, float_arr)

int32 [1 2 3 4 5]
float64 [1. 2. 3. 4. 5.]

arr = np.array([3.7, -1.2, -2.6, 0.5, 12.9, 10.1])
print(arr.dtype, arr)
int_arr = arr.astype(np.int32)
print(int_arr.dtype, int_arr )

float64 [ 3.7 -1.2 -2.6 0.5 12.9 10.1]
int32 [ 3 -1 -2 0 12 10]

1.3.3 字符串数组

str_arr = np.array(['好天','好天','学向','习上'])     # unicode字符串
print( str_arr )

['好天' '好天' '学向' '习上']

num_strings = np.array(['1.25', '-9.6', '42'], dtype=np.string_ )  # byte字符串
print( num_strings )

[b'1.25' b'-9.6' b'42']

print( num_strings.astype( float ) )  # 可以转换为float数组

[ 1.25 -9.6 42. ]

1.3.4 数据类型对象

a = np.array([[1,2],[3,4]])
print( a.dtype.byteorder )         # 字节顺序 '=','\': 代表本地或不适用;'<': 代表小头;'>': 代表大头
print( a.dtype.itemsize )          # 数据类型对象的元素大小

=
4

print(np.arange(7, dtype='f'))     # 也可以使用缩写数据类型
print(np.arange(7, dtype='D'))

[0. 1. 2. 3. 4. 5. 6.]
[0.+0.j 1.+0.j 2.+0.j 3.+0.j 4.+0.j 5.+0.j 6.+0.j]

print(np.dtype(float))
print(np.dtype('f8'))
print(np.dtype('d'))

float64
float64
float64

print(np.dtype('f'))

float32

t = np.dtype('float64')
print(t.char)
print(t.type)
print(t.str)

d
<class 'numpy.float64'>
<f8

1.4 创建自定义数据类型

custom_type = np.dtype([('title', np.str_, 40), ('num_in_stock', np.int32), ('price', np.float32)])
print(custom_type)
print(custom_type['title'])
products = np.array([('铅笔', 42, 2.5), ('小刀', 13, 5.6)], dtype=custom_type)
print(products[1])
print('库存中有', products[1]['num_in_stock'], '个', products[1]['title'] )

[('title', '<U40'), ('num_in_stock', '<i4'), ('price', '<f4')]
<U40
('小刀', 13, 5.6)
库存中有 13 个 小刀

1.5. 数组与标量的运算

arr = np.array([[1., 2., 3.], [4., 5., 6.]])
print(arr)

[[1. 2. 3.]
[4. 5. 6.]]

print(arr * arr)

[[ 1. 4. 9.]
[16. 25. 36.]]

print(arr - arr)

[[0. 0. 0.]
[0. 0. 0.]]

print(1 / arr)

[[1. 0.5 0.33333333]
[0.25 0.2 0.16666667]]

print(arr ** 0.5)

[[1. 1.41421356 1.73205081]
[2. 2.23606798 2.44948974]]

1.6 数组的索引与切片

1.6.1 一维数组

a = np.arange(9)
print( a )

[0 1 2 3 4 5 6 7 8]

print( a[3:7] )    # 3到7,共4个

[3 4 5 6]

print( a[:7:2] )   # 0到7,每2个取

[0 2 4 6]

print( a[::-1] )   # 反转数组

[8 7 6 5 4 3 2 1 0]

s = slice(3,7,2)   
print( a[s] )

[3 5]

s = slice(None, None, -1)
print( a[s] )

[8 7 6 5 4 3 2 1 0]

1.6.2 多维数组

# 比方说我家的家属楼,这个楼有3个单元(或叫楼门),每个单元有4层,每层有3户(左中右门)
# 第1位是单元,第2位是楼层,第3位是房号
b = np.empty((3,4,3), dtype='i')
for u in range(3):
    for l in range(4):
        for d in range(3):
            b[u,l,d] = ( u + 1 ) * 100 + ( l + 1 ) * 10 + d + 1
print( b )

[[[111 112 113]
[121 122 123]
[131 132 133]
[141 142 143]]

[[211 212 213]
[221 222 223]
[231 232 233]
[241 242 243]]

[[311 312 313]
[321 322 323]
[331 332 333]
[341 342 343]]]

print( b[0,0,0] )     # 取第1单元第1层第1户

111

print( b[:,0,0] )     # 取每个单元的第1层第1户

[111 211 311]

print( b[0, :, :] )   # 取第1个单元所有户
print( b[0] )         # 冒号可以省略
print( b[0, ...] )    # 也可以以三个点代替

[[111 112 113]
[121 122 123]
[131 132 133]
[141 142 143]]
[[111 112 113]
[121 122 123]
[131 132 133]
[141 142 143]]
[[111 112 113]
[121 122 123]
[131 132 133]
[141 142 143]]

print( b[0,1] )      # 取第1个单元第2层所有户

[121 122 123]

print( b[0,1,::2] )   # 取第1个单元第2层,每隔2户取1个,就是不取中门,取左右门

[121 123]

print( b[...,1] )     # 取每个单元每个楼层第2户人家,就是所有的中门人家

[[112 122 132 142]
[212 222 232 242]
[312 322 332 342]]

print( b[:,1] )      # 取所有单元的第2层的所有人家

[[121 122 123]
[221 222 223]
[321 322 323]]

print( b[0,:,1] )    # 取第1单元的所有楼层的第2户人家,就是第1单元的所有中门了

[112 122 132 142]

print( b[0,:,-1] )      # 取第1单元的所有楼层的最后那户人家,就是第1单元的所有右门了
print( b[0,::-1, -1] )  # 与上一样,只是逆序取

[113 123 133 143]
[143 133 123 113]

print( b[0,::2,-1] )    # 取第1个单元,每隔2层取(就是1,4层),最后1户(就是右门)

[113 133]

print( b[::-1] )        # 所有,单元逆序取,就是第3,第2,第1单元所有户人家

[[[311 312 313]
[321 322 323]
[331 332 333]
[341 342 343]]

[[211 212 213]
[221 222 223]
[231 232 233]
[241 242 243]]

[[111 112 113]
[121 122 123]
[131 132 133]
[141 142 143]]]

s = slice(None, None, -1)  # 所有数据逆序取
print( b[(s, s, s)] )

[[[343 342 341]
[333 332 331]
[323 322 321]
[313 312 311]]

[[243 242 241]
[233 232 231]
[223 222 221]
[213 212 211]]

[[143 142 141]
[133 132 131]
[123 122 121]
[113 112 111]]]

1.6.3 布尔型索引

# 比方说有3台位于不同地点的服务器,每个服务器不定时采集一定的数据
# 数据如下,有7行,每一行都是下面相应的服务器采集的,如第1行,第4行是北京站服务器采集的数据
data = np.random.rand(7, 4) * 100
print( data )
servers = np.array(['北京站', '上海站', '广州站', '北京站', '广州站', '上海站', '上海站'])
print( servers  )

[[25.88951926 81.02127917 81.65911148 10.54582293]
[19.88202433 71.59153418 17.59577045 17.9124011 ]
[28.26739131 42.55828296 5.35820796 49.74906725]
[70.79558748 38.60725419 84.20858241 80.57925252]
[97.09357428 32.93812722 81.46985854 98.7732454 ]
[56.46702002 59.03617618 99.32236983 40.70151618]
[77.99103033 53.07227406 67.61787932 37.19828265]]
['北京站' '上海站' '广州站' '北京站' '广州站' '上海站' '上海站']

print( servers == '北京站' )
print( data[servers == '北京站'] )    # 取北京站采集的相关数据

[ True False False True False False False]
[[25.88951926 81.02127917 81.65911148 10.54582293]
[70.79558748 38.60725419 84.20858241 80.57925252]]

print( data[servers == '北京站', 2:] )  # 从第3个开始取北京站采集的数据

[[81.65911148 10.54582293]
[84.20858241 80.57925252]]

print( data[servers == '北京站', 3] )   # 取北京站所有采集数据的第4条数据

[10.54582293 80.57925252]

print( data[(servers != '北京站')] )    # 取所有非北京站的数据
print( data[~(servers == '北京站')] )   # 同上,用波浪号~代表非

[[19.88202433 71.59153418 17.59577045 17.9124011 ]
[28.26739131 42.55828296 5.35820796 49.74906725]
[97.09357428 32.93812722 81.46985854 98.7732454 ]
[56.46702002 59.03617618 99.32236983 40.70151618]
[77.99103033 53.07227406 67.61787932 37.19828265]]
[[19.88202433 71.59153418 17.59577045 17.9124011 ]
[28.26739131 42.55828296 5.35820796 49.74906725]
[97.09357428 32.93812722 81.46985854 98.7732454 ]
[56.46702002 59.03617618 99.32236983 40.70151618]
[77.99103033 53.07227406 67.61787932 37.19828265]]

data[(servers == '上海站') | (servers == '广州站')]  #取所有上海站和广州站的数据

array([[19.88202433, 71.59153418, 17.59577045, 17.9124011 ],
[28.26739131, 42.55828296, 5.35820796, 49.74906725],
[97.09357428, 32.93812722, 81.46985854, 98.7732454 ],
[56.46702002, 59.03617618, 99.32236983, 40.70151618],
[77.99103033, 53.07227406, 67.61787932, 37.19828265]])

data[data < 50] = 0      # 将所有小于50的数据改为0
print( data )

[[ 0. 81.02127917 81.65911148 0. ]
[ 0. 71.59153418 0. 0. ]
[ 0. 0. 0. 0. ]
[70.79558748 0. 84.20858241 80.57925252]
[97.09357428 0. 81.46985854 98.7732454 ]
[56.46702002 59.03617618 99.32236983 0. ]
[77.99103033 53.07227406 67.61787932 0. ]]

data[servers != '北京站'] = 0   # 将所有非北京站的数据清零
print( data )

[[ 0. 81.02127917 81.65911148 0. ]
[ 0. 0. 0. 0. ]
[ 0. 0. 0. 0. ]
[70.79558748 0. 84.20858241 80.57925252]
[ 0. 0. 0. 0. ]
[ 0. 0. 0. 0. ]
[ 0. 0. 0. 0. ]]

1.6.4 其它索引

arr = np.arange(32).reshape((8, 4))
print( arr )

[[ 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[[2, 5, 6]]   # 取2,5,6行

array([[ 8, 9, 10, 11],
[20, 21, 22, 23],
[24, 25, 26, 27]])

arr[[-3, -5, -7]]  # 取倒数第3,5,7 行

array([[20, 21, 22, 23],
[12, 13, 14, 15],
[ 4, 5, 6, 7]])

arr[[1, 5, 7, 2], [0, 3, 1, 2]]  # 取[1,0],[5,3],[7,1],[2,2]

array([ 4, 23, 29, 10])

arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]]  # 取1,5,7,2行所有数据,按0,3,1,2顺序

array([[ 4, 7, 5, 6],
[20, 23, 21, 22],
[28, 31, 29, 30],
[ 8, 11, 9, 10]])

1.7 数组操作

1.7.1 数组转置

arr = np.arange(15).reshape((3, 5))
print(arr)

[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]

print( arr.transpose() )   # 转置数组
print( arr.T )             # 同上

[[ 0 5 10]
[ 1 6 11]
[ 2 7 12]
[ 3 8 13]
[ 4 9 14]]
[[ 0 5 10]
[ 1 6 11]
[ 2 7 12]
[ 3 8 13]
[ 4 9 14]]

1.7.2 改变数组的维度

b = np.arange(24).reshape(2,3,4)
print(b)

[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]

[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]

print( b.flat )            # 平面枚举器,将数组降维到1维数组
print( b.flat[10] )        
print( b.flat[2:7] ) 

<numpy.flatiter object at 0x05247488>
10
[2 3 4 5 6]

b_1 = b.flatten()    # 多维降为1维,返回的数组是一份copy, 不影响原数组
print( b_1 )      
b_1[0] = 100
print( b )

[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]

[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]

b_1 = b.ravel()    # 多维降为1维,但返回的数组是一份引用,修改后会影响原数组
print( b_1 )
b_1[0] = 100
print( b )        

[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
[[[100 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]

[[ 12 13 14 15]
[ 16 17 18 19]
[ 20 21 22 23]]]

b.shape = (6,4)
print( b )
b.resize((2,12))
print( b )

[[100 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[ 12 13 14 15]
[ 16 17 18 19]
[ 20 21 22 23]]
[[100 1 2 3 4 5 6 7 8 9 10 11]
[ 12 13 14 15 16 17 18 19 20 21 22 23]]

1.7.3 数组的组合

a = np.arange(9).reshape(3,3)
print( a )
b = 100 + a
print( b )

[[0 1 2]
[3 4 5]
[6 7 8]]
[[100 101 102]
[103 104 105]
[106 107 108]]

print( np.column_stack((a, b)) )         # 列组合 
print(np.hstack((a, b)))                 # 水平组合( horizontal stack ),效果同上
print(np.concatenate((a, b), axis=1) )   # 同上

[[ 0 1 2 100 101 102]
[ 3 4 5 103 104 105]
[ 6 7 8 106 107 108]]
[[ 0 1 2 100 101 102]
[ 3 4 5 103 104 105]
[ 6 7 8 106 107 108]]
[[ 0 1 2 100 101 102]
[ 3 4 5 103 104 105]
[ 6 7 8 106 107 108]]

print( np.row_stack((a, b)) )            # 行组合
print( np.vstack((a, b)) )               # 垂直组合 ( vertical stack ),效果同上
print( np.concatenate((a, b), axis=0) )  # 同上

[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[100 101 102]
[103 104 105]
[106 107 108]]
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[100 101 102]
[103 104 105]
[106 107 108]]
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[100 101 102]
[103 104 105]
[106 107 108]]

print( np.dstack((a, b)) )               # 深度组合( depth stack )

[[[ 0 100]
[ 1 101]
[ 2 102]]

[[ 3 103]
[ 4 104]
[ 5 105]]

[[ 6 106]
[ 7 107]
[ 8 108]]]

1.7.4 数组的分割

a = np.arange(9).reshape(3, 3)
print( a )

[[0 1 2]
[3 4 5]
[6 7 8]]

print( np.vsplit(a, 3) )                # 垂直分割( vertical split )    
print( np.split(a, 3, axis=0) )         # 同上

[array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]
[array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]

print( np.hsplit(a, 3) )                # 水平分割( horizontabl split)
print( np.split(a, 3, axis=1) )         # 同上

[array([[0],
[3],
[6]]), array([[1],
[4],
[7]]), array([[2],
[5],
[8]])]
[array([[0],
[3],
[6]]), array([[1],
[4],
[7]]), array([[2],
[5],
[8]])]

c = np.arange(27).reshape(3, 3, 3)
print( c )

[[[ 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]]]

print( np.dsplit(c, 3) )              # 深度分割 ( depth split )

[array([[[ 0],
[ 3],
[ 6]],

[[ 9],
[12],
[15]],

[[18],
[21],
[24]]]), array([[[ 1],
[ 4],
[ 7]],

[[10],
[13],
[16]],

[[19],
[22],
[25]]]), array([[[ 2],
[ 5],
[ 8]],

[[11],
[14],
[17]],

[[20],
[23],
[26]]])]

posted @ 2018-11-02 11:14  hanjackcyw  阅读(221)  评论(0)    收藏  举报