我是靠谱客的博主 现实小伙,最近开发中收集的这篇文章主要介绍数据科学初阶(三)-- numpy数组形状改变以及与字符串转换,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章说明: 本系列面向全国大中小学的通用数据科学教材,原项目是由
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:shapereshape虽然都能修改数组形状,但是不能改变数组中的元素总数,例如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即可。

注意到这里 xy的形状是一样的,还可以将它们连接成三维的数组,但是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]])
"""
  1. diagonal查看a数组的对角线元素
a.diagonal()
# array([11,22,,33])
  1. 使用偏移offset访问数组的次对角线
a.diagonal(offset=1)
# array([21,32])
a.diagonal(offset=-1)
# array([12,23])

对于偏移offset,正数表示向右移动,负数表示向左移动。

  1. 使用花式索引来访问对角线元素
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数组形状改变以及与字符串转换所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部