为什么numpynumpy 数组拼接保存之后数据发生了变化?

1、numpy数据存储及加载
作者:奋斗的珞珞
NumPy提供了多种存取数组内容的文件操作函数。保存数组数据的文件可以是二进制格式或者文本格式。二进制格式的文件又分为NumPy专用的格式化二进制类型和无格式类型。
1.1 tofile()和fromfile()
tofile()将数组中的数据以二进制存入文件,输出的数组并不保存数组形状和元素类型等信息。
fromfile() 函数读入数据时,需要用户明确指定元素类型,并对数组形状进行适当的需改。
从上面的例子可以看出,在读入数据时:需要正确设置dtype参数,并修改数组的shape属性才能得到和原始数据一致的结果。无论数据的排列顺序是C语言格式还是Fortran语言格式,tofile()都统一使用C语言格式输出。此外如果指定了sep参数,则fromfile()和tofile()将以文本格式对数组进行输入输出。sep参数指定的是文本数据中数值的分隔符
1.2save()和load()
NumPy专用的二进制格式保存数据,它们会自动处理元素类型和形状等信息
如果想将多个数组保存到一个文件中,可以使用savez()
savez()的第一个参数是文件名,其后的参数都是需要保存的数组,也可以使用关键字参数为数组起名
非关键字参数传递的数组会自动起名为arr_0、arr_1、…。
savez()输出的是一个扩展名为npz的压缩文件,其中每个文件都是一个save()保存的npy文件,文件名和数组名相同
load()自动识别npz文件,并且返回一个类似于字典的对象,可以通过数组名作为键获取数组的内容
可以看出,以上调用风格跟matlab调用很相似(*.mat)
In [19]: b=np.arange(0,1,0.1)
In [20]: b
Out[20]: array([ 0. ,
In [21]: c=np.sin(b)
In [22]: np.savez('out.npz',a,b,sin_array=c)
In [23]: r=np.load('out.npz')
In [24]: r['arr_0']
Out[24]: ##输出a
array([[0, 1, 2],
[3, 4, 5]])
In [25]: r['b']
##直接用名称调用,会出错
KeyError: 'b is not a file in the archive'
In [26]: r['sin_array']
######### 利用别名,可以成功调用
array([ 0.
1.3 savetxt()和loadtxt()
只能处理 1维和2维数组
可以用于CSV格式文本文件
InIn [31]: np.savetxt('a.txt',a) #缺省按'%.18e'格式保存数值,以空格分隔
上述为保存的文件数据格式。
In [34]: np.savetxt('a.txt',a,fmt='%d',delimiter=',')
In [35]: b=loadtxt('a.txt',delimiter=',')
In [36]: b=np.loadtxt('a.txt',delimiter=',')
In [37]: b
In [38]: b.dtype
Out[38]: dtype('float64')
### 导入的数据格式依然是float形式
使用matlab可直接加载txt数据
load('a.txt')
[a1,a2,a3,a4]=textread('test1.txt','%s%s%s%s','headerlines',4)
说明:%s可以是其他形式,跟读入的数据类型有关,比如这里也可以用%n,%f等。
这里%s的个数和[a1,a2,a3,a4]对应
本文已收录于以下专栏:
相关文章推荐
Numpy提供了几种数据保存的方法。以3*4数组a为例:1. a.tofile(&filename.bin&)
这种方法只能保存为二进制文件,且不能保存当前数据的行列信息,文件后缀不一定非要是bin...
Numpy提供了几种数据保存的方法。以3*4数组a为例:1. a.tofile(&filename.bin&)
这种方法只能保存为二进制文件,且不能保存当前数据的行列信息,文件后缀不一定非要是bin...
网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。
/w1991/p/4998707.html
ko可用来构建复杂的客户端交互应用,但几乎所有的web应用都需要跟服务器交互数据,或者至少...
数据加密与保存, 1、加密算法, 2、将数据保存到 LocalDB, 3、保存数据到文件
Python之pandas数据加载、存储与文件格式0. 输入与输出大致可分为三类:0.1 读取文本文件和其他更好效的磁盘存储格式
2.2 使用数据库中的数据
0.3 利用Web API操作网络资源
1 内存数据库存储
String createTableSQL = &CREATE TABLE [t_test] (& + &[id] INTEGER,&
+ &[name] VAR...
1.NumPy数组:
NumPy数组是一个多维数组对象,称为ndarray。其由两部分组成:
(1).实际的数据
(2).描述这些数据的元数据
大部分操作仅针对于元数据,而不改变底层实际的数据。
1.属性列表
属性列表类包括:
简写成plist
NSArray,NSDictionary,NSString,NSNumber,NSDate,NSData及它们的变体。
1、使用属性列表保存对象:
在Cocoa中,与一类名为属性列表的对象,常简称为plist。这些列表包含Cocoa知道如何操作的一组对象。具体来讲,Cocoa知道如何将它们保存到文件中并进行加载。属性...
安卓存取文件方法与java很像,可以直接使用java中的文件流,而需要注意的是:文件的存取lu
他的最新文章
讲师:王渊命
讲师:蔡栋
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)2465人阅读
Python(137)
数据分析(21)
pandas(14)
numpy(26)
接触pandas之后感觉它的很多功能似乎跟numpy有一定的重复,尤其是各种运算。不过,简单的了解之后发现在数据管理上pandas有着更为丰富的管理方式,其中一个很大的优点就是多出了对数据文件的管理。
如果想保存numpy中的数组元素到一个文件中,通过纯Python的文件写入当然是可以实现的,但是总觉得是少了一点便捷性。在这方面,pandas工具的使用就会让工作方便很多。下面通过一个简单的小例子来演示一下。
首先,创建numpy中的数组。
arr1 = np.arange(100).reshape(10,10)
array([[ 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, 32, 33, 34, 35, 36, 37, 38, 39],
&& & & [40, 41, 42, 43, 44, 45, 46, 47, 48, 49],
&& & & [50, 51, 52, 53, 54, 55, 56, 57, 58, 59],
&& & & [60, 61, 62, 63, 64, 65, 66, 67, 68, 69],
&& & & [70, 71, 72, 73, 74, 75, 76, 77, 78, 79],
&& & & [80, 81, 82, 83, 84, 85, 86, 87, 88, 89],
&& & & [90, 91, 92, 93, 94, 95, 96, 97, 98, 99]])
接着,为了能够使这组数据成为可以让pandas处理的数据,需要通过这个数组创建DataFrame。
In [20]: data1 = DataFrame(arr1)
这样,就可以通过pandas中DataFrame的to_csv方法实现数据文件的存储了。具体如下:
In [21]: data1.to_csv('data1.csv')
In [22]: cat data1.csv
,0,1,2,3,4,5,6,7,8,9
0,0,1,2,3,4,5,6,7,8,9
1,10,11,12,13,14,15,16,17,18,19
2,20,21,22,23,24,25,26,27,28,29
3,30,31,32,33,34,35,36,37,38,39
4,40,41,42,43,44,45,46,47,48,49
5,50,51,52,53,54,55,56,57,58,59
6,60,61,62,63,64,65,66,67,68,69
7,70,71,72,73,74,75,76,77,78,79
8,80,81,82,83,84,85,86,87,88,89
9,90,91,92,93,94,95,96,97,98,99
回头看一下被存储的数据格式:
In [23]: data1
& & 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9
0 & 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9
1& 10& 11& 12& 13& 14& 15& 16& 17& 18& 19
2& 20& 21& 22& 23& 24& 25& 26& 27& 28& 29
3& 30& 31& 32& 33& 34& 35& 36& 37& 38& 39
4& 40& 41& 42& 43& 44& 45& 46& 47& 48& 49
5& 50& 51& 52& 53& 54& 55& 56& 57& 58& 59
6& 60& 61& 62& 63& 64& 65& 66& 67& 68& 69
7& 70& 71& 72& 73& 74& 75& 76& 77& 78& 79
8& 80& 81& 82& 83& 84& 85& 86& 87& 88& 89
9& 90& 91& 92& 93& 94& 95& 96& 97& 98& 99
In [24]: type(data1)
Out[24]: pandas.core.frame.DataFrame
从上面的结果看一看出,转换成DataFrame的同时,数据信息增加了行列标题信息。
通过电子表格软件打开csv文件的效果如下:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:120947次
积分:3929
积分:3929
排名:第8313名
原创:287篇
(12)(59)(16)(5)(34)(70)(52)(28)(10)(2)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'3752人阅读
python(29)
Numpy提供了几种数据保存的方法。
& &以3*4数组a为例:
& & 1. a.tofile(&filename.bin&)
& & & 这种方法只能保存为二进制文件,且不能保存当前数据的行列信息,文件后缀不一定非要是bin,也可以为txt,但不影响保存格式,都是二进制。
& & & 这种保存方法对数据读取有要求,需要手动指定读出来的数据的的dtype,如果指定的格式与保存时的不一致,则读出来的就是错误的数据。
& & & &b = numpy.fromfile(&filename.bin&,dtype = **)
& & & &读出来的数据是一维数组,需要利用
& & & & b.shape = 3,4重新指定维数。
& & 2.numpy.save(&filename.npy&,a)
& & & &利用这种方法,保存文件的后缀名字一定会被置为.npy,这种格式最好只用
& & & &numpy.load(&filename&)来读取。
& &3.numpy.savetxt(&filename.txt&,a)
& & & b = &numpy.loadtxt(&filename.txt&)
& & &用于处理一维和二维数组
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1340641次
积分:20157
积分:20157
排名:第413名
原创:797篇
转载:87篇
评论:120条
(3)(1)(3)(1)(1)(4)(3)(3)(3)(6)(3)(3)(3)(2)(3)(2)(1)(1)(2)(2)(2)(15)(10)(3)(2)(5)(6)(2)(3)(1)(6)(2)(6)(1)(8)(5)(3)(12)(1)(10)(6)(28)(25)(1)(10)(28)(5)(25)(6)(33)(10)(26)(39)(17)(15)(23)(11)(3)(35)(5)(22)(6)(1)(29)(5)(1)(23)(20)(19)(24)(12)(3)(4)(10)(3)(1)(11)(8)(7)(11)(18)(52)(15)(1)(2)(2)(1)(2)(1)(1)(2)(11)(1)(1)(19)(15)(18)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'NumPy-快速处理数据 - 简书
NumPy-快速处理数据
NumPy为何而来?
标准安装的Python中用列表(list)保存一组值,可以用来当作数组使用,不过由于列表的元素可以是任 何对象,因此列表中所保存的是对象的指针。这样为了保存一个简单的[1,2,3],需要有3个指针和三个 整数对象。对于数值运算来说这种结构显然比较浪费内存和CPU计算时间。
此外Python还提供了一个array模块,array对象和列表不同,它直接保存数值,和C语言的一维数组比 较类似。但是由于它不支持多维,也没有各种运算函数,因此也不适合做数值运算。
NumPy的诞生弥补了这些不足,NumPy提供了两种基本的对象:
ndarray(N-dimensional array object) ndarray(下文统一称之为数组)是存储单一数据类型的多维数组
ufunc(universal function object) ufunc则是能够对数组进行处理的函数。
# -*- coding: utf-8 -*-
# 函数库的导入
import numpy as np
# ndarray对象
# 数组的创建
# 通过给array函数传递Python的序列对象创建数组,如果传递的是多层嵌套的序列,将创建多 维数组(下例中的变量c)
a = np.array([1, 2, 3, 4])
b = np.array([5, 6, 7, 8])
c = np.array([[1, 2, 3, 4], [4, 5, 6, 7], [7, 8, 9, 10]])
print c.dtype
# 数组的大小可以通过其shape属性获得
print a.shape, b.shape, c.shape
c.shape = 4, 3
c.shape = 2, -1
# 使用数组的reshape方法,可以创建一个改变了尺寸的新数组,原数组的shape保持不变
d = a.reshape((2, 2))
# 数组a和d其实共享数据存储内存区域,因此修改其中任意一个数组的元素都会同时修改另外一个数组的内容
a[1] = 100
# 将数组a的第一个元素改为100
# 可以通过dtype参数在创建时指定元素类型
print np.array([[1, 2, 3, 4], [4, 5, 6, 7], [7, 8, 9, 10]], dtype=np.float)
print np.array([[1, 2, 3, 4], [4, 5, 6, 7], [7, 8, 9, 10]], plex)
# NumPy提供了很多专门用来创建数组的函数
# arange函数类似于python的range函数,通过指定开始值、终值和步长来创建一维数组,注意 数组不包括终值
print np.arange(0, 1, 0.1)
# linspace函数通过指定开始值、终值和元素个数来创建一维数组, 可以通过endpoint关键字指定是否包括终值, 缺省设置是包括终值
print np.linspace(0, 1, 12)
# logspace函数和linspace类似,不过它创建等比数列,下面的例子产生1(10^0)到100(10^2)、 有20个元素的等比数列
print np.logspace(0, 2, 20)
# 使用frombuffer, fromstring, fromfile等函数可以从字节序列创建数组
s = "abcdefgh"
print np.fromstring(s, dtype=np.int8)
print np.fromstring(s, dtype=np.int16)
print np.fromstring(s, dtype=np.float)
# fromfunction函数的第一个参数为计算每个数组元素的函数,第二个参数为数组的大小(shape),因为 它支持多维数组,所以第二个参数必须是一个序列,本例中用(10,)创建一个10元素的一维数组
def func(i):
return i % 4 + 1
print np.fromfunction(func, (10,))
# 创建一个二维数组表示九九乘法表,输出的数组a中的每个元素a[i, j]都等于func2(i, j)
def func2(i, j):
return (i + 1) * (j + 1)
a = np.fromfunction(func2, (9, 9))
# 存取元素
a = np.arange(10)
print a[5]
print a[3:5]
print a[:5]
print a[:-1]
print a[2:4]
print a[1:-1:2]
# 范围中的第三个参数表示步长,2表示隔一个元素取一个元素
print a[::-1]
# 省略范围的开始下标和结束下标,步长为-1,整个数组头尾颠倒
print a[5:1:-2]
# 步长为负数时,开始下标必须大于结束下标
# 和Python的列表序列不同,通过下标范围获取的新的数组是原始数组的一个视图。它与原始数组共享 同一块数据空间
b = a[3:7]
# 通过下标范围产生一个新的数组b,b和a共享同一块数据空间
b[2] = -10
# 将b的第2个元素修改为-10
# a的第5个元素也被修改为10
# 使用整数序列
# 当使用整数序列对数组元素进行存取时,将使用整数序列中的每个元素作为下标,整数序列可以是列表或者数组。
# 使用整数序列作为下标获得的数组不和原始数组共享数据空间
x = np.arange(10, 1, -1)
print x[[3, 3, 1, 8]]
# 获取x中的下标为3, 3, 1, 8的4个元素,组成一个新的数组
b = x[np.array([3, 3, -3, 8])]
# 下标可以是负数
b[2] = 100
# 由于b和x不共享数据空间,因此x中的值并没有改变
x[[3, 5, 1]] = -1, -2, -3
# 整数序列下标也可以用来修改元素的值
# 使用布尔数组
x = np.arange(5, 0, -1)
x[np.array([True, False, True, False, False])]
# 布尔数组中下标为0,2的元素为True,因此获取x中下标为0,2的元素
x = np.random.rand(10)
# 产生一个长度为10,元素值为0-1的随机数的数组
# 2.1.3 多维数组
x = np.arange(0, 60, 10).reshape(-1, 1) + np.arange(0, 6)
# 结构数组
person_type = np.dtype({
'names': ['name', 'age', 'weight'],
'formats': ['S32', 'i', 'f']
a = np.array([("Zhang", 32, 75.5), ("Wang", 24, 65.2)], dtype=person_type)
a = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]], dtype=np.float32)
x = np.linspace(0, 2 * np.pi, 10)
t = np.sin(x, x)
print id(t) == id(x)
def triangle_wave(x, c, c0, hc):
x = x - int(x)
# 三角波的周期为1,因此只取x坐标的小数部分进行计算
if x &= c:
elif x & c0:
r = x / c0 * hc
r = (c - x) / (c - c0) * hc
x = np.linspace(0, 2, 1000)
y = np.array([triangle_wave(t, 0.6, 0.4, 1.0) for t in x])
triangle_ufunc = np.frompyfunc(lambda x: triangle_wave(x, 0.6, 0.4, 1.0), 1, 1)
y2 = triangle_ufunc(x)
def triangle_func(c, c0, hc):
def trifunc(x):
x = x - int(x)
# 三角波的周期为1,因此只取x坐标的小数部分进行计算
if x &= c:
elif x & c0:
r = x / c0 * hc
r = (c - x) / (c - c0) * hc
# 用trifunc函数创建一个ufunc函数,可以直接对数组进行计算, 不过通过此函数
# 计算得到的是一个Object数组,需要进行类型转换
return np.frompyfunc(trifunc, 1, 1)
y2 = triangle_func(0.6, 0.4, 1.0)(x)
《用Python做科学计算》
好好热爱生活。专注挖坑填坑30年。爱敲代码,立志用代码&算法&机器让生活变得更简单!numpy中的matrix和array
时间: 01:02:12
&&&& 阅读:32614
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&Preface
在相关聚类算法的实现过程中,用python语言实现,会经常出现array和matrix的混淆,这里做个总结。
numpy中最基本(默认)的类型是array,他的相关操作都是按元素操作的即用作数值计算当中(按元素操作有+,-,,/,*等)。相乘举例:
from numpy
&&& a=array([1,2])
array([1, 2])
&&& b=array([2,3])
array([2, 3])
array([2, 6])
&&& dot(a,b)
两个array的相乘*指的是对应元素的相乘;两个array的dot表示矩阵的相乘。
若a是array,则a.T表示转置。
把array转换为matrix用asmatrix()
多数numpy函数返回的是array类型,不是matrix类型。
matrix矩阵
在numpy中的特殊类型,是作为array的子类出现,所以继承了array的所有特性并且有自己的特殊的地方,专门用来处理线性代数操作(*表示矩阵的相乘,但是对于两个matrix的除/则表示对应元素的相除。)。乘法举例如:
&&& m=mat([2,3])
matrix([[2, 3]])
&&& n=([1,2])
Traceback (most recent call last):
File "&stdin&", line 1, in &module&
File "C:\Python27\lib\site-packages\numpy\matrixlib\defmatrix.py", line 341, i
return N.dot(self, asmatrix(other))
ValueError: objects are not aligned
&&& dot(m,n)
matrix([[8]])
&&& multiply(m,n)
matrix([[2,6]])
两个matrix相乘*错误原因是m的列不等于n的行,也即不对齐(aligned),若对齐了,则是对应元素的相乘,返回一个matrix;两个matrix的*表示是两个矩阵的相乘。两个matrix的dot表示矩阵相乘。两个matrix的multiply表示对应元素的相乘。**
- matrix中.H,.A,.I表示共轭,转置,逆矩阵。
- 把matrix转换为array用asarray()
- asanyarray()根据和你的输入的类型保持一致。
这里会涉及到rank的概念,在线性代数(math)rank表示秩,但是必须明确的是在numpy里rank不是表示秩的概念,是表示维数的概念,这个理解的话需要看此文章:对于多维arrays的数据结构解释:
[多维arrays数据结构理解][1]
这里暂时理解为秩,虽然这样理解是错误的,但是可以说的通一些事情。(在实际的array和matrix里,英文里介绍的关于rank就用线性代数的秩来理解,但是英文会出现dimensions等于多少等,要求matrix的dimesions必须为2,这里其实指的就是秩,dimensions才是在numpy里的真实的理解形式)
array要求秩为1(N*1,1*N等)或者大于2
matrix要求秩必须为2(rank必须为2)
- 下面是关于ndim和size的理解:
array([1, 2])
array([[1, 2],
matrix([[1, 2, 3, 4],
[2, 3, 4, 5]])
array([[1, 2, 3, 4],
[2, 3, 4, 5]])
matrix([[1, 2, 3, 4],
[2, 3, 4, 5],
[3, 4, 5, 6]])
&&& a.size
&&& a.ndim
&&& b.size
&&& b.ndim
&&& c.size
&&& c.ndim
&&& d.size
&&& d.ndim
&&& e.ndim
**这里ndim就是求的是rank,所以会发现matrix的都是2,但是array的就会存在差异,需要计算等。size返回的是元素的个数**
- 关于dim, shape, rank, dimension and axis in numpy的细节的问题理解:
[stackoverflow地址][2]
M = matrix([, , , [4]])
如何转变为
array([1, 2, 3, 4])
比较优雅的办法:
x=matrix(arange(12).reshape((3,4)))
matrix([[ 0,
9, 10, 11]])
array([ 0,
9, 10, 11])
在运用中,还是用array好点,array的唯一缺陷就是在表示矩阵的相乘时候,要用dot,而不是*。
关于numpy里的array和matrix的其余的操作函数,另见wiki地址:
标签:&&&&&&&&&&&&&&&
&&国之画&&&& &&&&chrome插件
版权所有 京ICP备号-2
迷上了代码!

我要回帖

更多关于 numpy 数组拼接 的文章

 

随机推荐