当前位置: 首页 > 面试题库 >

Numpy中没有结构化数组的二进制运算符?

平航
2023-03-14
问题内容

好的,因此,在完成了有关numpy的结构化数组的教程之后,我可以创建一些简单的示例:

from numpy import array, ones
names=['scalar', '1d-array', '2d-array']
formats=['float64', '(3,)float64', '(2,2)float64']
my_dtype = dict(names=names, formats=formats)
struct_array1 = ones(1, dtype=my_dtype)
struct_array2 = array([(42., [0., 1., 2.], [[5., 6.],[4., 3.]])], dtype=my_dtype)

(我的预期用例将包含三个以上的条目,并且将使用非常长的1d数组。)因此,一切顺利,直到我们尝试执行一些基本的数学运算为止。我收到以下所有错误:

struct_array1 + struct_array2
struct_array1 * struct_array2
1.0 + struct_array1
2.0 * struct_array2

显然,即使最简单的结构化数组也不支持简单的运算符(+,-,*,/)。还是我错过了什么?我应该看看其他包装吗(不要说熊猫,因为这完全太过分了)?这似乎是一项显而易见的功能,所以我有点傻眼了。但是,很难在网上找到关于此的chat不休。这不会严重限制结构化数组的用途吗?为什么有人会使用结构数组而不是包装在字典中的数组?是否出于技术上的原因可能难以解决?或者,如果正确的解决方案是执行繁重的工作,那么在保持操作快速的同时又如何呢?


问题答案:

对整个阵列进行操作的另一种方法是使用文档中描述的’union’dtype。在您的示例中,您可以通过添加“联合”字段并指定重叠的“偏移量”来扩展dtype:

from numpy import array, ones, zeros

names=['scalar', '1d-array', '2d-array', 'union']
formats=['float64', '(3,)float64', '(2,2)float64', '(8,)float64']
offsets=[0, 8, 32, 0]
my_dtype = dict(names=names, formats=formats, offsets=offsets)
struct_array3=zeros((4,), dtype=my_dtype)

['union']现在可以访问所有数据作为(n,8)数组

struct_array3['union'] # == struct_array3.view('(8,)f8')
struct_array3['union'].shape  # (4,8)

您可以对“联合”或任何其他字段进行操作:

struct_array3['union'] += 2
struct_array3['scalar']= 1

“联合”字段可以是另一个兼容的形状,例如'(2,4)float64'。这样的数组的“行”可能看起来像:

array([ (3.0, [0.0, 0.0, 0.0], [[2.0, 2.0], [0.0, 0.0]], 
      [[3.0, 0.0, 0.0, 0.0], [2.0, 2.0, 0.0, 0.0]])], 
      dtype={'names':['scalar','1d-array','2d-array','union'], 
             'formats':['<f8',('<f8', (3,)),('<f8', (2, 2)),('<f8', (2, 4))], 
             'offsets':[0,8,32,0], 
             'itemsize':64})


 类似资料:
  • 问题内容: 我有一个字典,需要将其转换为NumPy结构化数组。我正在使用arcpy函数,因此NumPy结构化数组是唯一可以使用的数据格式。 我已经试过了: 但我不断 下面的方法有效,但是很愚蠢,显然不适用于真实数据。我知道有一个更优雅的方法,我只是想不通。 问题答案: 您可以使用: 产量 如果您不想创建元组的中间列表,则可以改用: 在Python2中: 在Python3中: 为什么使用该列表不起作

  • 我有两个错误。当我使用 二进制运算符' 我需要帮助!

  • 我想制作一个简单的Java程序,但我得到了以下错误: 这是我的代码:

  • 问题内容: 我有一个二进制数组,我想将其转换为整数列表,其中每个int是该数组的一行。 例如: 我想转换成。 问题答案: 我曾经在这里问过类似的问题。这是我的回答,适合您的问题:

  • 问题内容: 小数dtype是否在numpy中可用? 我想numpy.array并不支持每个dtype,但是我认为只要定义正确的操作,它至少可以让dtype传播到尽可能远的距离。我想念什么吗?有什么办法可以工作吗? 问题答案: 重要提示:这是一个糟糕的答案 所以我在真正理解问题之前回答了这个问题。答案已被接受,并且有一些支持,但您最好跳至下一个。 原始答案: 似乎可用: 我不确定您要完成的工作,您的

  • 问题内容: 我正在尝试将二维数组转换为具有命名字段的结构化数组。我希望2D数组中的每一行成为结构化数组中的新记录。不幸的是,我没有尝试过以我期望的方式工作。 我从开始: 我想转换为以下形式: 我尝试过的 这两种方法都尝试将myarray中的每个条目转换为具有给定dtype的记录,因此将插入多余的零。我不知道如何获取它以将每一行转换为一条记录。 另一尝试: 这次不执行任何实际转换。内存中的现有数据只

  • 问题内容: NumPy“结构化数组”,“记录数组”和“ recarray”之间的区别是什么? 该NumPy的文档 暗示,前两个是相同的:如果是这样,这是该对象的首选术语? 同样的文件说,(在页面的底部):你可以找到关于recarrays和结构化阵列(包括两者之间的区别)一些更多的信息在这里。是否有对此差异的简单解释? 问题答案: 记录/记录数组在 https://github.com/numpy/

  • 在我的Android应用程序中,我创建了一个序列化的ArrayList并使用writeObject()将其写成二进制文件。我想把这个文件复制到PC上,读入一个程序(我需要用C++编写),在那里我会查看/编辑信息,把它写回文件,然后把它发送回Android设备,在那里它会被正确地解释。 是否存在序列化对象的结构定义?