- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个文件 header value 字典(时间、帧数、年、月等),我想将其写入一个 numpy 数组。我目前的代码如下:
arr=np.array([(k,)+v for k,v in fileheader.iteritems()],dtype=["a3,a,i4,i4,i4,i4,f8,i4,i4,i4,i4,i4,i4,a10,a26,a33,a235,i4,i4,i4,i4,i4,i4"])
但我得到一个错误,“只能将元组(而不是“int”)连接到元组。
基本上,最终结果需要是存储整个文件头信息(512 字节)和每帧数据(头和数据,每帧 49408 字节)的数组。有更简单的方法吗?
编辑:为了澄清(也为我自己),我需要将文件每一帧的数据写入一个数组。我得到了 matlab 代码作为基础。这是给我的代码的粗略概念:
data.frame=zeros([512 96])
frame=uint8(fread(fid,[data.numbeams,512]),'uint8'))
data.frame=frame
如何将“框架”翻译成 Python?
最佳答案
您最好只将 header 数据保存在字典中。你真的需要它作为一个数组吗? (如果是,为什么?将 header 放在 numpy 数组中有一些优点,但它比简单的 dict
更复杂,而且不那么灵活。)
dict
的一个缺点是它的键没有可预测的顺序。如果您需要以常规顺序(类似于 C 结构)将 header 写回磁盘,则需要单独存储字段的顺序及其值。如果是这种情况,您可能会考虑一个有序的字典 (collections.OrderedDict
) 或只是将一个简单的类放在一起来保存您的 header 数据并将订单存储在那里。
除非有充分的理由将其放入 numpy 数组中,否则您可能不想这样做。
但是,结构化数组将保留 header 的顺序,并使将其二进制表示形式写入磁盘变得更加容易,但在其他方面却不够灵活。
如果你确实想让标题成为一个数组,你会做这样的事情:
import numpy as np
# Lists can be modified, but preserve order. That's important in this case.
names = ['Name1', 'Name2', 'Name3']
# It's "S3" instead of "a3" for a string field in numpy, by the way
formats = ['S3', 'i4', 'f8']
# It's often cleaner to specify the dtype this way instead of as a giant string
dtype = dict(names=names, formats=formats)
# This won't preserve the order we're specifying things in!!
# If we iterate through it, things may be in any order.
header = dict(Name1='abc', Name2=456, Name3=3.45)
# Therefore, we'll be sure to pass things in in order...
# Also, np.array will expect a tuple instead of a list for a structured array...
values = tuple(header[name] for name in names)
header_array = np.array(values, dtype=dtype)
# We can access field in the array like this...
print header_array['Name2']
# And dump it to disk (similar to a C struct) with
header_array.tofile('test.dat')
另一方面,如果您只想访问 header 中的值,只需将其保存为 dict
。那样更简单。
根据听起来你正在做的事情,我会做这样的事情。我正在使用 numpy 数组读取 header ,但 header 值实际上存储为类属性(以及 header 数组)。
这看起来比实际更复杂。
我只是定义了两个新类,一个用于父文件,一个用于框架。您可以用更少的代码来做同样的事情,但这为您打下了处理更复杂事情的基础。
import numpy as np
class SonarFile(object):
# These define the format of the file header
header_fields = ('num_frames', 'name1', 'name2', 'name3')
header_formats = ('i4', 'f4', 'S10', '>I4')
def __init__(self, filename):
self.infile = open(filename, 'r')
dtype = dict(names=self.header_fields, formats=self.header_formats)
# Read in the header as a numpy array (count=1 is important here!)
self.header = np.fromfile(self.infile, dtype=dtype, count=1)
# Store the position so we can "rewind" to the end of the header
self.header_length = self.infile.tell()
# You may or may not want to do this (If the field names can have
# spaces, it's a bad idea). It will allow you to access things with
# sonar_file.Name1 instead of sonar_file.header['Name1'], though.
for field in self.header_fields:
setattr(self, field, self.header[field])
# __iter__ is a special function that defines what should happen when we
# try to iterate through an instance of this class.
def __iter__(self):
"""Iterate through each frame in the dataset."""
# Rewind to the end of the file header
self.infile.seek(self.header_length)
# Iterate through frames...
for _ in range(self.num_frames):
yield Frame(self.infile)
def close(self):
self.infile.close()
class Frame(object):
header_fields = ('width', 'height', 'name')
header_formats = ('i4', 'i4', 'S20')
data_format = 'f4'
def __init__(self, infile):
dtype = dict(names=self.header_fields, formats=self.header_formats)
self.header = np.fromfile(infile, dtype=dtype, count=1)
# See discussion above...
for field in self.header_fields:
setattr(self, field, self.header[field])
# I'm assuming that the size of the frame is in the frame header...
ncols, nrows = self.width, self.height
# Read the data in
self.data = np.fromfile(infile, self.data_format, count=ncols * nrows)
# And reshape it into a 2d array.
# I'm assuming C-order, instead of Fortran order.
# If it's fortran order, just do "data.reshape((ncols, nrows)).T"
self.data = self.data.reshape((nrows, ncols))
你会像这样使用它:
dataset = SonarFile('input.dat')
for frame in dataset:
im = frame.data
# Do something...
关于python - 从字典写入 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10838982/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!