概述
文章说明: 本系列面向全国大中小学的通用数据科学教材,原项目是由
Jin Li大佬整理的python笔记,鄙人学习后添加了许多自己的见解,于是最后写成了这系列手册。
本文代码均在jupyter notebook上实现。
文章目录
- 数组形状
- 修改数组形状
- 增加数组维数
- 去除数组多余轴
- 数组转置
- 数组连接
- 多维数组转换一维
- 确保数组的维数
- 查看对角线元素
- 数组与字符串的转换
- 数组元素转换为字符串
- 字符串转换为数组元素
- 写入文件
数组形状
修改数组形状
先来创建一个数组:
a = arange(6)
a
# array([0,1,2,3,4,5])
将其形状修改为2*3:
a.shape = 2,3
a
"""
array([[0, 1, 2],
[3, 4, 5]])
"""
使用
shape
方法会修改原数组。
另一种修改形状方式——使用reshape
函数
a.reshape(2,3)
"""
array([[0, 1, 2],
[3, 4, 5]])
"""
注意:
reshape
函数不会修改原数组的值,而是返回一个新数组。
Warning:shape
和reshape
虽然都能修改数组形状,但是不能改变数组中的元素总数,例如2*3
的数组是无法修改形状为3*3
的。
增加数组维数
使用newaxis
来增加数组的维数:
# 创建一个一维数组
a = arange(3)
shape(3)
# (3L,)
# 向a数组前插入一个长度为1的维度
y = a[newaxis, :]
shape(y)
# (1L,3L)
当然,根据newaxis
插入的位置不同,可以返回不同形状的数组,也可以增加多个维数:
y = a[:, newaxis]
shape(y)
# (3L, 1L)
y = a[newaxis, newaxis, :]
shape(y)
# (1L, 1L, 3L)
去除数组多余轴
使用squeeze
方法,可以去除数组中所有长度为1的维度,例如下例:
a = arange(6)
a.shape = (2,1,3)
# 此时使用squeeze,将a数组多余的1去除,这里1代表长度为1的维度
b = a.squeeze()
shape(b)
# (2L, 3L)
数组转置
可以使用transpose
方法返回转置数组。
转置数组即将原数组的行维数和列维数相互交换。
a = arange(6)
# 修改原数组形状
a.shape = 2,3
b = a.transpose()
shape(b)
# (3,2)
或者也可以使用
transpose
方法的缩写a.T
。
如果是转置多维数组,则转置的结果只是交换轴的位置,实例如下:
a = arange(60)
a.shape = 3,4,5
b = a.T
shape(b)
# (5L,4L,3L)
一个注意点:数组a
和它的转置a.T
是两两相互映射的,如果改变其中任一个,则另一个也会被改变。
如果不希望整个矩阵转置,而是向要交换两轴位置,则可以使用
a.swapaxes(axis1, axis2)
来交换两个维度的位置。
数组连接
使用concatenate(a0,a1,...,aN), axis=0)
注意:这里的数组都被包含在一个元组中。
该方法默认是将数组沿着第一维(即axis=0
)进行连接:
x = array([
[0,1,2],
[10,11,12]
])
y = array([
[50,51,52],
[60,61,62]
])
print x.shape
print y.shape
"""
(2L, 3L)
(2L, 3L)
"""
z = concatenate((x,y), axis=0)
z
"""
array([[ 0,
1,
2],
[10, 11, 12],
[50, 51, 52],
[60, 61, 62]])
"""
z.shape(4L, 3L)
如果需要沿着第二维连接,只需要把
axis=0
改为axis=1
即可。
注意到这里 x
和 y
的形状是一样的,还可以将它们连接成三维的数组,但是concatenate
方法不能提供这样的功能,不过可以这样:
z = array((x,y))
z
"""
Out[21]:
array([[[ 0,
1,
2],
[10, 11, 12]],
[[50, 51, 52],
[60, 61, 62]]])
"""
z.shape
# (2,2,3)
事实上,为了便利广大数据科学爱好者,Numpy提供了发别对应以上三个功能的函数:
# 对应concatenate((,), axis=0)
vstack((x,y))
# 对应concatenate((,), axis=1)
hstack((x,y))
# 对应array((x,y))
dstack((x,y))
Tips:
有的小伙伴可能会疑惑如何判断一个数组的维数呢,这里我分享一下我是如何判别的。
例如上例中的z
,最后输出的array
,每一个行数组内都有3个元素,暂且把行数组称为a小
,由2个a小
数组又组成一个比它大一点的数组,暂且将这样的数组称为a中
,然后又由两个a中
组成了一个比它还大的数组,这个数组就是数组z
啦。
如果遇到更高维的数组,可以类推,即a1
=> a2
=> … => z
。
是不是觉得理解了呢
^_^
(你说什么,我没带眼镜,听不清楚,假装你们听懂了)
多维数组转换一维
使用flatten
方法可以将多维数组转换维一维数组:
a = array([[0,1],
[2,3]])
b = a.flatten()
b
"""
Out[32]:
array([0, 1, 2, 3])
"""
注意:这里是返回数组的备份,不会修改原数组的值。
也可以使用数组自带的flat
属性:
a.flat # flat会返回一个元组组成的迭代器
# <numpy.flatiter at 0x3d546a0>
b = a.flat
这里需要注意的是使用flat
属性,修改b的值会影响a。
print(a)
"""
[[0,1],
[2,3]]
"""
b[0] = 10
print(a)
"""
[[10
1]
[ 2
3]]
"""
除此之外,也可以使用ravel
方法:
a = array([[0,1],
[2,3]])
b = a.ravel()
b
"""
Out[39]:
array([0, 1, 2, 3])
"""
在另一种情况下,令b为a的转置数组,则修改b的元素不会改变a,因为a和a的转置是相互映射的。
确保数组的维数
函数atleast_xd
可以保证数组的维数至少是x,而x的取值可以为 1,2,3。
a = array([1,2,3])
a.shape
# (3L,)
# 使用atleast_2d确保a维数至少为2
b = atleast_2d(a)
b.shape
"""
Out[46]:
(1L, 3L)
"""
查看对角线元素
先创建一个3*3数组
a = np.array([11,21,31,12,22,32,13,23,33])
a.shape = 3,3
a
"""
array([[11, 21, 31],
[12, 22, 32],
[13, 23, 33]])
"""
diagonal
查看a数组的对角线元素
a.diagonal()
# array([11,22,,33])
- 使用偏移
offset
访问数组的次对角线
a.diagonal(offset=1)
# array([21,32])
a.diagonal(offset=-1)
# array([12,23])
对于偏移
offset
,正数表示向右移动,负数表示向左移动。
- 使用花式索引来访问对角线元素
i = [0,1,2]
# 访问数组a的[0,0],[1,1],[2,2]位置的元素,即对角线
a[i,i]
# array([11,22,33])
数组与字符串的转换
数组元素转换为字符串
使用tostring
方法:
import numpy as np
a = np.array([1,2],[3,4])
# 将其转换为字符串
a.tostring()
# 'x01x02x03x04'
这里可以指定数组元素转换为字符串的格式,使用
order='方式'
字符串转换为数组元素
使用fromstring
函数相当于tostring
函数的逆过程,可以从字符串中读出数据,但是一定要指定数据类型:
import numpy as np
a = np.array([1,2],[3,4])
s = a.tostring()
a = np.fromstring(s, dtype=np.uint8)
a
# array([1, 2, 3, 4], dtype=uint8)
如果是数组内容不是数值,而是文本内容或者是二进制文件,则可以使用以下函数:
- 文本文件
loadtxt
genfromtxt
savetxt
- 二进制文件
save
load
savez
当然,聪明的你也会向数组能不能转换为列表呢,答案是可以的,只需要使用
a.tolist()
!
写入文件
使用tofile
函数将文件内容写入:
# 以 , 为分隔符写入,并且格式为字符串
a.tofile('data.csv', sep=',', format="%s"
最后
以上就是现实小伙为你收集整理的数据科学初阶(三)-- numpy数组形状改变以及与字符串转换的全部内容,希望文章能够帮你解决数据科学初阶(三)-- numpy数组形状改变以及与字符串转换所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复