首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否可以在numpy数组中添加不同长度的行,然后向python中的行添加元素?

是否可以在numpy数组中添加不同长度的行,然后向python中的行添加元素?
EN

Stack Overflow用户
提问于 2021-12-20 21:45:16
回答 2查看 142关注 0票数 -1
  • Python版本: 3.7.11
  • numpy版本: 1.21.2

我想要一个numpy数组,如下所示:

代码语言:javascript
运行
复制
[
    ["Hi", "Anne"],
    ["How", "are", "you"],
    ["fine"]
]

但是创建这个numpy数组的过程并不简单,它如下所示:

  • # code block 1开始时,我们有一个空的numpy数组。

第一个循环:

在第一个循环中添加

  • # code block 2 ,或者

在这个循环中,我们理解我们需要一个新的行。

第一个循环中的一个循环:

该行的

  • # code block 3 elements将被添加到这个内部循环中。

假设:

  • 没有指定迭代次数,我的意思是:

代码语言:javascript
运行
复制
- the number of columns of each row is different and
代码语言:javascript
运行
复制
- we don't know the number of rows that we want to add to numpy array.

也许下面的代码示例将帮助我理解我的观点:

代码语言:javascript
运行
复制
a = [["Hi", "Anne"], ["How", "are", "you"], ["fine"]]

# code block 1: code for creating empty numpy array

for row in a:
    # code block 2: code for creating empty row
    
    for element in row:
        # code block 3: code for appending element to that row or last row

问题:

  • 是否可以使用这些步骤(code block #1, #2, #3)创建一个numpy数组?

如果是,怎么做?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-21 05:12:54

从嵌套列表开始:

代码语言:javascript
运行
复制
In [99]: alist = [
    ...:     ["Hi", "Anne"],
    ...:     ["How", "are", "you"],
    ...:     ["fine"]
    ...: ]
In [100]: alist
Out[100]: [['Hi', 'Anne'], ['How', 'are', 'you'], ['fine']]

利用它制作一个数组:

代码语言:javascript
运行
复制
In [101]: arr = np.array(alist)
<ipython-input-101-3fd8e9bd05a9>:1: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.
  arr = np.array(alist)
In [102]: arr
Out[102]: 
array([list(['Hi', 'Anne']), list(['How', 'are', 'you']), list(['fine'])],
      dtype=object)

这一警告告诉我们,我们正在做一些不寻常的事情,或者至少是次优。我们可以用dtype=object来抑制警告,但是结果是一样的。

看看结果--它是一个3元素数组,其中每个元素都是一个列表。它不是多维数组。我们可以做一个数组

代码语言:javascript
运行
复制
In [103]: arr1 = np.array([np.array(el) for el in arr], object)
In [104]: arr1
Out[104]: 
array([array(['Hi', 'Anne'], dtype='<U4'),
       array(['How', 'are', 'you'], dtype='<U3'),
       array(['fine'], dtype='<U4')], dtype=object)

听起来像是要用数组复制这个列表构造函数:

在107: al = []

代码语言:javascript
运行
复制
     ...: for row in alist:
     ...:     al1 = []
     ...:     for el in row:
     ...:         al1.append(el)
     ...:     al.append(al1)
     ...: 
In [108]: al
Out[108]: [['Hi', 'Anne'], ['How', 'are', 'you'], ['fine']]

但也有几个问题。

没有简单的“空”数组;数组可以具有(0,或(0,3)或(3,0,3)等形状。

数组没有一个简单而快速的appendnp.append不符合条件。任何“增长”数组的尝试都会导致生成一个带有完整副本的新数组。List append只是向设计为增长的对象添加了一个指针。

虽然numpy可以生成字符串dtype数组(如104),但它没有特殊的字符串处理代码。您仍然必须使用python字符串方法来操作这些字符串。

对象dtype数组上的数学是偶然的,比数字数组上的数学慢。本质上,它发生在列表理解的速度。

numpy是为多维阵列的快速数值计算而设计的。想想矩阵乘法,加法之类的东西。即使作为机器学习的垫脚石,数组也需要是数字的和“矩形的”。衣衫褴褛的列表不能用于ML。

票数 1
EN

Stack Overflow用户

发布于 2021-12-20 21:55:06

Numpy数组没有针对不一致的维度进行优化,因此也没有良好的实践。您只能通过使元素对象(而不是字符串)来做到这一点。但就像我说的,矮胖不是解决这个问题的方法。

代码语言:javascript
运行
复制
a = numpy.array([["Hi", "Anne"], ["How", "are", "you"], ["fine"]], dtype=object)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70428401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档