【问题标题】:Is there a Numpy function for casting just one element to a different type than the rest?是否有一个 Numpy 函数可以将一个元素转换为与其他元素不同的类型?
【发布时间】:2021-12-02 11:53:45
【问题描述】:

我的代码如下:

file_ = open('file.txt', 'r')
lines = file_.readlines()
data = []
for row in lines:
    temp = row.split()
    data.append(np.array(temp).astype(np.float64))

我想将数组中的每个项目都转换为浮动,除了最后一个,我想保留一个字符串。

我该怎么做?

【问题讨论】:

  • 不,这没有任何意义。 Numpy 数组对象是同质类型的。您可以使用object dtype,但为什么呢?只需使用常规列表并将 numpy 完全排除在外
  • @juanpa.arrivillaga。在这里使用重新排列不会太费力。
  • 所以这是一个numpy数组的python列表。您要更改最终数组还是每个数组中的最终值?你打算以后如何使用它?您可以创建一个包含 2 个值的元组 (np.array(temp[:-1]).astype(np.float64), temp[-1])。这行得通吗?
  • 首先,这是您要对文件的每一行执行的操作吗?所有行的模式是否相同,n 浮动后跟 1 个字符串?如果是这样,您是否尝试过使用np.genfromtxt 读取文件?使用dtype=None,您可以获得具有适当列数据类型的结构化数组。或者使用usecols 选择一组列作为浮点数加载,并使用另一个加载加载字符串列。推荐结构化数组(或recarray)很容易,但我发现很多初学者并不能充分利用这种数组。

标签: python numpy


【解决方案1】:

不,没有将同一数组的元素转换为不同类型的功能。与常规 Python 列表不同,numpy 数组是同质的,并且存储具有固定物理记录大小的元素,因此数组的每个元素必须始终具有相同的类型。

您可以单独处理字符串并仅将数字部分解析为 numpy 数组:

for row in lines:
    temp = row.split()
    numbers = temp[:-1]
    stringbit = temp[-1]
    data.append(np.array(numbers).astype(np.float64))

或者,如果您的数据非常一致并且每一行始终具有相同的类型结构,您可以使用更复杂的 numpy dtype 和 numpy.genfromtext 使每一行成为更大数组的元素。

您可能还会发现pandas.DataFrame 更适合处理此类异构数据。

一个包含有用细节的相关问题:NumPy array/matrix of mixed types

【讨论】:

    【解决方案2】:

    你可以使用recarrays。

    在您的行中是具有相似数据的记录,您可以创建一个自定义 dtype 来满足您的需求。在这种情况下,对同质数据类型的要求是元素的数量是恒定的,并且最终字符串中的字符数有一个上限。

    这是一个假设字符串仅包含 ASCII 字符的示例:

    max_len = 10
    dtype = np.dtype([('c1', np.float_), ('c2', np.float_), ('c3', np.float_), ('str', f'S{max_len}')])
    
    row = [(10.0, 1.2, 4.5, b'abc')]
    result = np.array(row, dtype)
    

    如果您不想单独命名每个浮点列,可以将该字段设为子数组:

    dtype = np.dtype([('flt', np.float_, 3), ('str', f'S{max_len}')])
    
    row = [([10.0, 1.2, 4.5], b'abc')]
    

    如果字符串的长度未知,您可以在该字段中使用 object dtype 并简单地存储一个引用。

    尽管有可能,但您可能会发现将浮点数加载到一个数组中并将字符串加载到另一个数组中更简单。我通常发现使用同构的内置 dtype 的数组比使用recarrays 更简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-14
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多