Numpy学习笔记——数组操作

声明:本文仅作为学习笔记,不作它用

修改形状

numpy.reshape

在不改变数据的条件下修改形状

numpy.reshape(arr, newshape, order)

参数:
arr:要修改形状的数组
newshape:整数或者整数数组,新的形状应当兼容原有形状
order:'C’为 C 风格顺序,'F’为 F 风格顺序,'A’为保留原顺序。

import numpy as np
a = np.arange(8)
print '原始数组:'
print a
print '\n'
 
b = a.reshape(4,2)
print '修改后的数组:'
print b

输出结果:

原始数组:
[0 1 2 3 4 5 6 7]
 
修改后的数组:
[[0 1]
 [2 3]
 [4 5]
 [6 7]]

numpy.ndarray.flat

返回数组上的一维迭代器

import numpy as np 
a = np.arange(8).reshape(2,4) 
print '原始数组:' 
print a 
print '\n' 
 
print '调用 flat 函数之后:' 
# 返回展开数组中的下标的对应元素 
print a.flat[5]

输出结果:

原始数组:
[[0 1 2 3]
 [4 5 6 7]]
 
调用 flat 函数之后:
5

numpy.ndarray.flatten

返回折叠为一维的数组副本

ndarray.flatten(order)

参数:
order:‘C’ – 按行,‘F’ – 按列,‘A’ – 原顺序,‘k’ – 元素在内存中的出现顺序。

import numpy as np 
a = np.arange(8).reshape(2,4) 
 
print '原数组:' 
print a 
print '\n'  
# default is column-major 
 
print '展开的数组:' 
print a.flatten() 
print '\n'  
 
print '以 F 风格顺序展开的数组:' 
print a.flatten(order = 'F')

输出结果:

原数组:
[[0 1 2 3]
 [4 5 6 7]]
 
展开的数组:
[0 1 2 3 4 5 6 7]
 
以 F 风格顺序展开的数组:
[0 4 1 5 2 6 3 7]

numpy.ndarray.ravel

这个函数返回展开的一维数组,并且按需生成副本。返回的数组和输入数组拥有相同数据类型。这个函数接受两个参数。

numpy.ravel(a, order)
import numpy as np 
a = np.arange(8).reshape(2,4) 
 
print '原数组:' 
print a 
print '\n'  
 
print '调用 ravel 函数之后:' 
print a.ravel()  
print '\n' 
 
print '以 F 风格顺序调用 ravel 函数之后:' 
print a.ravel(order = 'F')

输出结果:

原数组:
[[0 1 2 3]
 [4 5 6 7]]
 
调用 ravel 函数之后:
[0 1 2 3 4 5 6 7]
 
以 F 风格顺序调用 ravel 函数之后:
[0 4 1 5 2 6 3 7]

翻转操作

numpy.transpose

翻转给定数组的维度

numpy.transpose(arr, axes)

参数:
arr:要转置的数组
axes:整数的列表,对应维度,通常所有维度都会翻转。

import numpy as np 
a = np.arange(12).reshape(3,4) 
 
print '原数组:' 
print a  
print '\n' 
 
print '转置数组:' 
print np.transpose(a)

输出结果:

原数组:
[[ 0 1 2 3]
 [ 4 5 6 7]
 [ 8 9 10 11]]
 
转置数组:
[[ 0 4 8]
 [ 1 5 9]
 [ 2 6 10]
 [ 3 7 11]]

numpy.rollaxis

向后滚动特定的轴,直到一个特定位置

numpy.rollaxis(arr, axis, start)

参数:
arr:输入数组
axis:要向后滚动的轴,其他轴的相对位置不会改变
start:默认为零,表示完整的滚动,会滚动到特定位置

# 创建了三维的 ndarray 
import numpy as np 
a = np.arange(8).reshape(2,2,2) 
 
print '原数组:' 
print a 
print '\n'
# 将轴 2 滚动到轴 0(宽度到深度)
 
print '调用 rollaxis 函数:' 
print np.rollaxis(a,2)  
# 将轴 0 滚动到轴 1:(宽度到高度)
print '\n' 
 
print '调用 rollaxis 函数:' 
print np.rollaxis(a,2,1)

输出结果:

原数组:
[[[0 1]
 [2 3]]
 [[4 5]
 [6 7]]]
 
调用 rollaxis 函数:
[[[0 2]
 [4 6]]
 [[1 3]
 [5 7]]]
 
调用 rollaxis 函数:
[[[0 2]
 [1 3]]
 [[4 6]
 [5 7]]]

numpy.swapaxes

交换数组的两个轴

numpy.swapaxes(arr, axis1, axis2)

参数:
arr:要交换其轴的输入数组
axis1:对应第一个轴的整数
axis2:对应第二个轴的整数

# 创建了三维的 ndarray 
import numpy as np 
a = np.arange(8).reshape(2,2,2) 
 
print '原数组:'
print a 
print '\n'  
# 现在交换轴 0(深度方向)到轴 2(宽度方向)
 
print '调用 swapaxes 函数后的数组:' 
print np.swapaxes(a, 2, 0)

输出结果:

原数组:
[[[0 1]
 [2 3]]
 
 [[4 5]
  [6 7]]]
 
调用 swapaxes 函数后的数组:
[[[0 4]
 [2 6]]
 
 [[1 5]
  [3 7]]]

修改维度

numpy.broadcast

返回一个对象,该对象封装了将一个数组广播到另一个数组的结果

import numpy as np 
x = np.array([[1], [2], [3]]) 
y = np.array([4, 5, 6])  
   
# 对 y 广播 x
b = np.broadcast(x,y)  
# 它拥有 iterator 属性,基于自身组件的迭代器元组 
 
print '对 y 广播 x:' 
r,c = b.iters 
print r.next(), c.next() 
print r.next(), c.next() 
print '\n'  
# shape 属性返回广播对象的形状
 
print '广播对象的形状:' 
print b.shape 
print '\n'  
# 手动使用 broadcast 将 x 与 y 相加
b = np.broadcast(x,y) 
c = np.empty(b.shape) 
 
print '手动使用 broadcast 将 x 与 y 相加:' 
print c.shape 
print '\n'  
c.flat = [u + v for (u,v) in b] 
 
print '调用 flat 函数:' 
print c 
print '\n'  
# 获得了和 NumPy 内建的广播支持相同的结果
 
print 'x 与 y 的和:' 
print x + y

输出结果:

对 y 广播 x:
1 4
1 5
 
广播对象的形状:
(3, 3)
 
手动使用 broadcast 将 x 与 y 相加:
(3, 3)
 
调用 flat 函数:
[[ 5. 6. 7.]
 [ 6. 7. 8.]
 [ 7. 8. 9.]]
 
x 与 y 的和:
[[5 6 7]
 [6 7 8]
 [7 8 9]]

numpy.broadcast_to

将数组广播到新形状。它在原始数组上返回只读视图,通常不连续

numpy.broadcast_to(array, shape, subok)
import numpy as np 
a = np.arange(4).reshape(1,4) 
 
print '原数组:' 
print a 
print '\n'  
 
print '调用 broadcast_to 函数之后:' 
print np.broadcast_to(a,(4,4))

输出结果:

[[0  1  2  3] 
 [0  1  2  3] 
 [0  1  2  3] 
 [0  1  2  3]]

numpy.expand_dims

numpy.expand_dims(arr, axis)

参数:
arr:输入数组
axis:新轴插入的位置

import numpy as np 
x = np.array(([1,2],[3,4])) 
 
print '数组 x:' 
print x 
print '\n'  
y = np.expand_dims(x, axis = 0) 
 
print '数组 y:' 
print y 
print '\n'
 
print '数组 x 和 y 的形状:' 
print x.shape, y.shape 
print '\n'  
# 在位置 1 插入轴
y = np.expand_dims(x, axis = 1) 
 
print '在位置 1 插入轴之后的数组 y:' 
print y 
print '\n'  
 
print 'x.ndim 和 y.ndim:' 
print x.ndim,y.ndim 
print '\n'  
 
print 'x.shape 和 y.shape:' 
print x.shape, y.shape

numpy.squeeze

从给定数组的形状中删除一维条目

numpy.squeeze(arr, axis)

参数:
arr:输入数组
axis:整数或整数元组,用于选择形状中单一维度条目的子集

import numpy as np  
x = np.arange(9).reshape(1,3,3) 
 
print '数组 x:' 
print x 
print '\n'  
y = np.squeeze(x) 
 
print '数组 y:' 
print y 
print '\n'  
 
print '数组 x 和 y 的形状:' 
print x.shape, y.shape

输出结果:

数组 x:
[[[0 1 2]
 [3 4 5]
 [6 7 8]]]
 
数组 y:
[[0 1 2]
 [3 4 5]
 [6 7 8]]
 
数组 x 和 y 的形状:
(1, 3, 3) (3, 3)

数组的连接

numpy.concatenate

用于沿指定轴连接相同形状的两个或多个数组

numpy.concatenate((a1, a2, ...), axis)

参数:
a1,a2:相同类型的数组序列
axis:沿着它连接数组的轴,默认为0

import numpy as np 
a = np.array([[1,2],[3,4]]) 
 
print '第一个数组:' 
print a 
print '\n'  
b = np.array([[5,6],[7,8]]) 
 
print '第二个数组:' 
print b 
print '\n'  
# 两个数组的维度相同 
 
print '沿轴 0 连接两个数组:' 
print np.concatenate((a,b)) 
print '\n'  
 
print '沿轴 1 连接两个数组:' 
print np.concatenate((a,b),axis = 1)

输出结果:

第一个数组:
[[1 2]
 [3 4]]
 
第二个数组:
[[5 6]
 [7 8]]
 
沿轴 0 连接两个数组:
[[1 2]
 [3 4]
 [5 6]
 [7 8]]
 
沿轴 1 连接两个数组:
[[1 2 5 6]
 [3 4 7 8]]

numpy.stack

沿新轴连接数组序列

numpy.stack(arrays, axis)

参数:
arrays:相同形状的数组序列
axis:返回数组中的轴,输入数组沿着它来堆叠

import numpy as np 
a = np.array([[1,2],[3,4]]) 
 
print '第一个数组:' 
print a 
print '\n'
b = np.array([[5,6],[7,8]]) 
 
print '第二个数组:' 
print b 
print '\n'  
 
print '沿轴 0 堆叠两个数组:' 
print np.stack((a,b),0) 
print '\n'  
 
print '沿轴 1 堆叠两个数组:' 
print np.stack((a,b),1)

输出结果:

第一个数组:
[[1 2]
 [3 4]]
 
第二个数组:
[[5 6]
 [7 8]]
 
沿轴 0 堆叠两个数组:
[[[1 2]
 [3 4]]
 [[5 6]
 [7 8]]]
 
沿轴 1 堆叠两个数组:
[[[1 2]
 [5 6]]
 [[3 4]
 [7 8]]]

numpy.hstack

通过堆叠来生成水平的单个数组

import numpy as np 
a = np.array([[1,2],[3,4]]) 
 
print '第一个数组:' 
print a 
print '\n'  
b = np.array([[5,6],[7,8]]) 
 
print '第二个数组:' 
print b 
print '\n'  
 
print '水平堆叠:' 
c = np.hstack((a,b)) 
print c 
print '\n'

输出结果:

第一个数组:
[[1 2]
 [3 4]]
 
第二个数组:
[[5 6]
 [7 8]]
 
水平堆叠:
[[1 2 5 6]
 [3 4 7 8]]

numpy.vstack

通过堆叠来生成竖直的单个数组

import numpy as np 
a = np.array([[1,2],[3,4]]) 
 
print '第一个数组:' 
print a 
print '\n'  
b = np.array([[5,6],[7,8]]) 
 
print '第二个数组:' 
print b 
print '\n'
 
print '竖直堆叠:' 
c = np.vstack((a,b)) 
print c

输出结果:

第一个数组:
[[1 2]
 [3 4]]
 
第二个数组:
[[5 6]
 [7 8]]
 
竖直堆叠:
[[1 2]
 [3 4]
 [5 6]
 [7 8]]

数组分割

numpy.split

沿特定的轴将数组分割为子数组

numpy.split(ary, indices_or_sections, axis)

参数:
ary:被分割的输入数组
indices_or_sections:可以是整数,表明要从输入数组创建的,等大小的子数组的数量。 如果此参数是一维数组,则其元素表明要创建新子数组的点。
axis:默认为 0

import numpy as np 
a = np.arange(9) 
 
print '第一个数组:' 
print a 
print '\n'  
 
print '将数组分为三个大小相等的子数组:' 
b = np.split(a,3) 
print b 
print '\n'  
 
print '将数组在一维数组中表明的位置分割:' 
b = np.split(a,[4,7])
print b 

输出结果:

第一个数组:
[0 1 2 3 4 5 6 7 8]
 
将数组分为三个大小相等的子数组:
[array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])]
 
将数组在一维数组中表明的位置分割:
[array([0, 1, 2, 3]), array([4, 5, 6]), array([7, 8])]

numpy.hsplit

split()函数的特例,其中轴为 1 表示水平分割,无论输入数组的维度是什么。

import numpy as np 
a = np.arange(16).reshape(4,4) 
 
print '第一个数组:' 
print a 
print '\n'  
 
print '水平分割:' 
b = np.hsplit(a,2) 
print b 
print '\n'

输出结果:

第一个数组:
[[ 0 1 2 3]
 [ 4 5 6 7]
 [ 8 9 10 11]
 [12 13 14 15]]
 
水平分割:                                                         
[array([[ 0,  1],                                                             
       [ 4,  5],                                                              
       [ 8,  9],                                                              
       [12, 13]]), 
array([[ 2,  3],                                           
       [ 6,  7],                                                              
       [10, 11],                                                              
       [14, 15]])] 

numpy.vsplit

是split()函数的特例,其中轴为 0 表示竖直分割,无论输入数组的维度是什么。

import numpy as np 
a = np.arange(16).reshape(4,4) 
 
print '第一个数组:' 
print a 
print '\n'
 
print '竖直分割:' 
b = np.vsplit(a,2) 
print b

输出结果:

第一个数组:
[[ 0 1 2 3]
 [ 4 5 6 7]
 [ 8 9 10 11]
 [12 13 14 15]]
 
竖直分割:                                                           
[array([[0, 1, 2, 3],                                                         
       [4, 5, 6, 7]]), 
array([[ 8,  9, 10, 11],                               
       [12, 13, 14, 15]])] 

添加/删除元素

numpy.resize

此函数返回指定大小的新数组。如果新大小大于原始大小,则包含原始数组中的元素的重复副本。

numpy.resize(arr, shape)
import numpy as np 
a = np.array([[1,2,3],[4,5,6]]) 
 
print '第一个数组:' 
print a 
print '\n'
 
print '第一个数组的形状:' 
print a.shape 
print '\n'  
b = np.resize(a, (3,2)) 
 
print '第二个数组:' 
print b 
print '\n'  
 
print '第二个数组的形状:' 
print b.shape 
print '\n'  
# 要注意 a 的第一行在 b 中重复出现,因为尺寸变大了 
 
print '修改第二个数组的大小:' 
b = np.resize(a,(3,3)) 
print b

输出结果:

第一个数组:
[[1 2 3]
 [4 5 6]]
 
第一个数组的形状:
(2, 3)
 
第二个数组:
[[1 2]
 [3 4]
 [5 6]]
 
第二个数组的形状:
(3, 2)
 
修改第二个数组的大小:
[[1 2 3]
 [4 5 6]
 [1 2 3]]

numpy.append

此函数在输入数组的末尾添加值。 附加操作不是原地的,而是分配新的数组。 此外,输入数组的维度必须匹配否则将生成ValueError。

numpy.append(arr, values, axis)

参数:
arr:输入数组
values:要向arr添加的值,比如和arr形状相同(除了要添加的轴)
axis:沿着它完成操作的轴。如果没有提供,两个参数都会被展开。

import numpy as np 
a = np.array([[1,2,3],[4,5,6]]) 
 
print '第一个数组:' 
print a 
print '\n'  
 
print '向数组添加元素:' 
print np.append(a, [7,8,9]) 
print '\n'  
 
print '沿轴 0 添加元素:' 
print np.append(a, [[7,8,9]],axis = 0) 
print '\n'  
 
print '沿轴 1 添加元素:' 
print np.append(a, [[5,5,5],[7,8,9]],axis = 1)

输出结果:

第一个数组:
[[1 2 3]
 [4 5 6]]
 
向数组添加元素:
[1 2 3 4 5 6 7 8 9]
 
沿轴 0 添加元素:
[[1 2 3]
 [4 5 6]
 [7 8 9]]
 
沿轴 1 添加元素:
[[1 2 3 5 5 5]
 [4 5 6 7 8 9]]

numpy.insert

此函数在给定索引之前,沿给定轴在输入数组中插入值。 如果值的类型转换为要插入,则它与输入数组不同。 插入没有原地的,函数会返回一个新数组。 此外,如果未提供轴,则输入数组会被展开。

numpy.insert(arr, obj, values, axis)

参数:
obj:在其之前插入值的索引

import numpy as np 
a = np.array([[1,2],[3,4],[5,6]]) 
 
print '第一个数组:' 
print a 
print '\n'  
 
print '未传递 Axis 参数。 在插入之前输入数组会被展开。' 
print np.insert(a,3,[11,12]) 
print '\n'  
print '传递了 Axis 参数。 会广播值数组来配输入数组。' 
 
print '沿轴 0 广播:' 
print np.insert(a,1,[11],axis = 0) 
print '\n'  
 
print '沿轴 1 广播:' 
print np.insert(a,1,11,axis = 1)

输出结果:

第一个数组:
[[1 2]
 [3 4]
 [5 6]]


未传递 Axis 参数。 在插入之前输入数组会被展开。
[ 1  2  3 11 12  4  5  6]


传递了 Axis 参数。 会广播值数组来配输入数组。
沿轴 0 广播:
[[ 1  2]
 [11 11]
 [ 3  4]
 [ 5  6]]


沿轴 1 广播:
[[ 1 11  2]
 [ 3 11  4]
 [ 5 11  6]]

numpy.unique

此函数返回输入数组中的去重元素数组。 该函数能够返回一个元组,包含去重数组和相关索引的数组。 索引的性质取决于函数调用中返回参数的类型。

numpy.unique(arr, return_index, return_inverse, return_counts)

参数:
arr:输入数组,如果不是一维数组则会展开
return_index:如果为true,返回输入数组中的元素下标
return_inverse:如果为true,返回去重数组的下标,它可以用于重构输入数组
return_counts:如果为true,返回去重数组中的元素在原数组中的出现次数

import numpy as np 
a = np.array([5,2,6,2,7,5,6,8,2,9]) 
 
print '第一个数组:' 
print a 
print '\n'  
 
print '第一个数组的去重值:' 
u = np.unique(a) 
print u 
print '\n'  
 
print '去重数组的索引数组:' 
u,indices = np.unique(a, return_index = True) 
print indices 
print '\n'  
 
print '我们可以看到每个和原数组下标对应的数值:' 
print a 
print '\n'  
 
print '去重数组的下标:' 
u,indices = np.unique(a,return_inverse = True) 
print u 
print '\n' 
 
print '下标为:' 
print indices 
print '\n'  
 
print '使用下标重构原数组:' 
print u[indices] 
print '\n'  
 
print '返回去重元素的重复数量:' 
u,indices = np.unique(a,return_counts = True) 
print u 
print indices

输出结果:

第一个数组:
[5 2 6 2 7 5 6 8 2 9]
 
第一个数组的去重值:
[2 5 6 7 8 9]
 
去重数组的索引数组:
[1 0 2 4 7 9]
 
我们可以看到每个和原数组下标对应的数值:
[5 2 6 2 7 5 6 8 2 9]
 
去重数组的下标:
[2 5 6 7 8 9]
 
下标为:
[1 0 2 0 3 1 2 4 0 5]
 
使用下标重构原数组:
[5 2 6 2 7 5 6 8 2 9]
 
返回唯一元素的重复数量:
[2 5 6 7 8 9]
 [3 2 2 1 1 1]

引用

Python之Numpy详细教程

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值