# -*- coding: utf-8 -*-
import numpy as np
In [11]:
arr = np.arange(10)
np.save('some_array', arr)
In [12]:
print np.load('some_array.npy')
In [13]:
#多个数组压缩存储
np.savez('arrays.npz', a=arr, b=arr)
arch = np.load('arrays.npz')
print arch['b']
In [15]:
arr = np.loadtxt('array_ex.txt', delimiter = ',')
arr
Out[15]:
In [16]:
import matplotlib.pyplot as plt
import pylab
In [20]:
# intro
points = np.arange(-5, 5, 0.01) #生成100个点
xs, ys = np.meshgrid(points, points) #xs, ys互为转置矩阵
print xs
print ys
z = np.sqrt(xs ** 2 + ys ** 2)
z
Out[20]:
In [23]:
plt.imshow(z, cmap = plt.cm.gray);
plt.colorbar()
plt.title("Image plot of $\sqrt{x^2 + y^2}$ for a grid of values")
pylab.show()
In [24]:
arr = np.random.randn(5, 4)
print arr
print arr.mean()
print arr.sum()
print arr.mean(axis = 1) #对每一行的元素求和
print arr.sum(0) #对每一列的元素求和,axis可以省略
In [25]:
arr = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
print arr.cumsum(0)
print arr.cumprod(1)
In [27]:
arr = np.random.randn(100)
(arr > 0).sum()
Out[27]:
In [30]:
#对数组逻辑操作
bools = np.array([False, False, True, False])
print bools.any() # 有一个为True则返回True
print bools.all() # 有一个为False则返回False
In [32]:
'''
关于zip函数的一点解释,zip可以接受任意多参数,然后重新组合成1个tuple列表。
zip([1, 2, 3], [4, 5, 6], [7, 8, 9])
返回结果:[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
'''
print '通过真值表选择元素'
x_arr = np.array([1.1, 1.2, 1.3, 1.4, 1.5])
y_arr = np.array([2.1, 2.2, 2.3, 2.4, 2.5])
cond = np.array([True, False, True, True, False])
result = [(x if c else y) for x, y, c in zip(x_arr, y_arr, cond)] # 通过列表推到实现
result
Out[32]:
In [34]:
np.where(cond, x_arr, y_arr) #使用Numpy的where函数
Out[34]:
In [35]:
#更多where的例子
arr = np.random.randn(4, 4)
print arr
print np.where(arr > 0, 2, -2)
print np.where(arr < 0, 2, arr)
In [36]:
cond_1 = np.array([True, False, True, True, False])
cond_2 = np.array([False, True, False, True, False])
# 传统代码如下
result = []
for i in xrange(len(cond)):
if cond_1[i] and cond_2[i]:
result.append(0)
elif cond_1[i]:
result.append(1)
elif cond_2[i]:
result.append(2)
else:
result.append(3)
result
Out[36]:
In [37]:
#np版本代码
result = np.where(cond_1 & cond_2, 0,
np.where(cond_1, 1, np.where(cond_2, 2, 3)))
result
Out[37]:
In [41]:
arr = np.random.randn(5, 3)
arr.sort(1) #对每一行元素做排序
arr
Out[41]:
In [42]:
#找位置在5%de zishu arr = np.random.randn(1000)
arr.sort()
arr[int(0.05 * len(arr))]
Out[42]:
In [43]:
names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
print sorted(set(names)) #传统Python做法
print np.unique(names)
ints = np.array([3, 3, 3, 2, 2, 1, 1, 4, 4])
print np.unique(ints)
In [44]:
#查找数组元素是否在另一数组
values = np.array([6, 0, 0, 3, 2, 5, 6])
np.in1d(values, [2, 3, 6])
Out[44]:
In [45]:
# 通过索引访问二维数组某一行或某个元素
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print arr[2]
print arr[0][2]
print arr[0, 2] # 普通Python数组不能用。
In [48]:
# 对更高维数组的访问和操作
arr = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
print arr[0] # 结果是个2维数组
print arr[1, 0] # 结果是个2维数组
old_values = arr[0].copy() # 复制arr[0]的值
arr[0] = 42 # 把arr[0]所有的元素都设置为同一个值
print arr
arr[0] = old_values # 把原来的数组写回去
print arr
print
In [49]:
print '使用切片访问和操作数组'
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print arr[1:6] # 打印元素arr[1]到arr[5]
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print arr[:2] # 打印第1、2行
print arr[:2, 1:] # 打印第1、2行,第2、3列
print arr[:, :1] # 打印第一列的所有元素
arr[:2, 1:] = 0 # 第1、2行,第2、3列的元素设置为0
arr
Out[49]:
In [61]:
print '使用布尔数组作为索引'
name_arr = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
rnd_arr = np.random.randn(7, 4) # 随机7*4数组
print rnd_arr
print name_arr == 'Bob' # 返回布尔数组,元素等于'Bob'为True,否则False。
print rnd_arr[name_arr == 'Bob'] # 利用布尔数组选择行
print rnd_arr[name_arr == 'Bob', :2] # 增加限制打印列的范围
print rnd_arr[-(name_arr == 'Bob')] # 对布尔数组的内容取反
mask_arr = (name_arr == 'Bob') | (name_arr == 'Will') # 逻辑运算混合结果
print rnd_arr[mask_arr]
rnd_arr[name_arr != 'Joe'] = 7 # 先布尔数组选择行,然后把每行的元素设置为7。
print rnd_arr
In [62]:
#使用普通一维数组生成NumPy一维数组'
data = [4, 3, 4, 6, 9]
arr = np.array(data)
print arr
print arr.dtype
In [63]:
#使用普通二维数组生成NumPy二维数组
data = [[1, 2, 3], [5, 6, 7]]
arr = np.array(data)
print arr
print arr.shape
In [67]:
#使用zeros/empty
print '使用zeros/empty'
print np.zeros(10) # 生成包含10个0的一维数组
print np.zeros((3, 6)) # 生成3*6的二维数组
print np.empty((2, 3, 2)) # 生成2*3*2的三维数组,所有元素未初始化。
print
print '使用arrange生成连续元素'
print np.arange(15) # [0, 1, 2, ..., 14]
In [69]:
print '生成数组时指定数据类型'
arr = np.array([1, 2, 3], dtype = np.float64)
print arr.dtype
arr = np.array([1, 2, 3], dtype = np.int32)
print arr.dtype
In [71]:
print '使用astype复制数组并转换数据类型'
int_arr = np.array([1, 2, 3, 4, 5])
float_arr = int_arr.astype(np.float)
print int_arr.dtype
print float_arr.dtype
In [72]:
print '使用astype将float转换为int时小数部分被舍弃'
float_arr = np.array([3.7, -1.2, -2.6, 0.5, 12.9, 10.1])
int_arr = float_arr.astype(dtype = np.int)
print int_arr
print
In [73]:
print '使用astype把字符串转换为数组,如果失败抛出异常。'
str_arr = np.array(['1.25', '-9.6', '42'], dtype = np.string_)
float_arr = str_arr.astype(dtype = np.float)
print float_arr
print
In [75]:
print 'astype使用其它数组的数据类型作为参数'
int_arr = np.arange(10)
float_arr = np.array([.23, 0.270, .357, 0.44, 0.5], dtype = np.float64)
print int_arr.astype(float_arr.dtype)
print int_arr[0], int_arr[1] # astype做了复制,数组本身不变。
In [76]:
print 'Fancy Indexing: 使用整数数组作为索引'
arr = np.empty((8, 4))
for i in range(8):
arr[i] = i
print arr
print arr[[4, 3, 0, 6]] # 打印arr[4]、arr[3]、arr[0]和arr[6]。
print arr[[-3, -5, -7]] # 打印arr[3]、arr[5]和arr[-7]行
arr = np.arange(32).reshape((8, 4)) # 通过reshape变换成二维数组
print arr[[1, 5, 7, 2], [0, 3, 1, 2]] # 打印arr[1, 0]、arr[5, 3],arr[7, 1]和arr[2, 2]
print arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]] # 1572行的0312列
print arr[np.ix_([1, 5, 7, 2], [0, 3, 1, 2])] # 可读性更好的写法
In [77]:
# 数组乘法/减法,对应元素相乘/相减。
arr = np.array([[1.0, 2.0, 3.0], [4., 5., 6.]])
print arr * arr
print arr - arr
print
# 标量操作作用在数组的每个元素上
arr = np.array([[1.0, 2.0, 3.0], [4., 5., 6.]])
print 1 / arr
print arr ** 0.5 # 开根号
In [79]:
print '转置矩阵'
arr = np.arange(15).reshape((3, 5))
print arr
print arr.T
print
print '转置矩阵做点积'
arr = np.random.randn(6, 3)
print np.dot(arr.T, arr)
print
print '高维矩阵转换'
arr = np.arange(16).reshape((2, 2, 4))
print arr
'''
详细解释:
arr数组的内容为
- a[0][0] = [0, 1, 2, 3]
- a[0][1] = [4, 5, 6, 7]
- a[1][0] = [8, 9, 10, 11]
- a[1][1] = [12, 13, 14, 15]
transpose的参数为坐标,正常顺序为(0, 1, 2, ... , n - 1),
现在传入的为(1, 0, 2)代表a[x][y][z] = a[y][x][z],第0个和第1个坐标互换。
- a'[0][0] = a[0][0] = [0, 1, 2, 3]
- a'[0][1] = a[1][0] = [8, 9, 10, 11]
- a'[1][0] = a[0][1] = [4, 5, 6, 7]
- a'[1][1] = a[1][1] = [12, 13, 14, 15]
'''
print arr.transpose((1, 0, 2))
print arr.swapaxes(1, 2) # 直接交换第1和第2个坐标
In [80]:
print '连接两个二维数组'
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([[7, 8, 9], [10, 11, 12]])
print np.concatenate([arr1, arr2], axis = 0) # 按行连接
print np.concatenate([arr1, arr2], axis = 1) # 按列连接
print
In [81]:
# 所谓堆叠,参考叠盘子。。。连接的另一种表述
print '垂直stack与水平stack'
print np.vstack((arr1, arr2)) # 垂直堆叠
print np.hstack((arr1, arr2)) # 水平堆叠
print
In [83]:
print '拆分数组'
arr = np.random.randn(5, 5)
print arr
print '水平拆分'
first, second, third = np.split(arr, [1, 3], axis = 0)
print 'first'
print first
print 'second'
print second
print 'third'
print third
print '垂直拆分'
first, second, third = np.split(arr, [1, 3], axis = 1)
print 'first'
print first
print 'second'
print second
print 'third'
print third
print
In [85]:
# 堆叠辅助类
arr = np.arange(6)
arr1 = arr.reshape((3, 2))
arr2 = np.random.randn(3, 2)
print 'r_用于按行堆叠'
print np.r_[arr1, arr2]
print 'c_用于按列堆叠'
print np.c_[np.r_[arr1, arr2], arr]
print '切片直接转为数组'
print np.c_[1:6, -10:-5]
In [86]:
print 'Fancy Indexing例子代码'
arr = np.arange(10) * 100
inds = [7, 1, 2, 6]
print arr[inds]
print
In [88]:
print '使用take'
print arr.take(inds)
print
print '使用put更新内容'
arr.put(inds, 50)
print arr
arr.put(inds, [70, 10, 20, 60])
print arr
print
print 'take,指定轴'
arr = np.random.randn(2, 4)
inds = [2, 0, 2, 1]
print arr
print arr.take(inds, axis = 1) # 按列take
In [90]:
print 'Repeat: 按元素'
arr = np.arange(3)
print arr.repeat(3)
print arr.repeat([2, 3, 4]) # 3个元素,分别复制2, 3, 4次。长度要匹配!
print
print 'Repeat,指定轴'
arr = np.random.randn(2, 2)
print arr
print arr.repeat(2, axis = 0) # 按行repeat
print arr.repeat(2, axis = 1) # 按列repeat
print arr.repeat(2, axis = 0) # 按行repeat
print
print 'Tile: 参考贴瓷砖'
print np.tile(arr, 2)
print np.tile(arr, (2, 3)) # 指定每个轴的tile次数
In [91]:
print "将一维数组转换为二维数组"
arr = np.arange(8)
print arr.reshape((4, 2))
print arr.reshape((4, 2)).reshape((2, 4)) # 支持链式操作
print
print "维度大小自动推导"
arr = np.arange(15)
print arr.reshape((5, -1))
print
print "获取维度信息并应用"
other_arr = np.ones((3, 5))
print other_arr.shape
print arr.reshape(other_arr.shape)
print
print "高维数组拉平"
arr = np.arange(15).reshape((5, 3))
print arr.ravel()
In [ ]: