Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python numpy-附加到数组而不创建副本_Python_Arrays_Numpy - Fatal编程技术网

Python numpy-附加到数组而不创建副本

Python numpy-附加到数组而不创建副本,python,arrays,numpy,Python,Arrays,Numpy,Python列表是指针,因此我可以执行以下操作: a = [] b = a b.append(1) >>> print a, b [1] [1] 使用numpy实现此行为的方法是什么?因为numpy的append创建了一个新数组。即: a = np.array([]) b = a b = np.append(b, 1) >>> print a, b [] [1.] 编辑 我正在努力实现的目标: 我有一个大的文本文件,我正试图用re解析它:根据文件中的

Python列表是指针,因此我可以执行以下操作:

a = []
b = a

b.append(1)

>>> print a, b
[1] [1]
使用numpy实现此行为的方法是什么?因为numpy的append创建了一个新数组。即:

a = np.array([])
b = a

b = np.append(b, 1)
>>> print a, b
[] [1.]
编辑 我正在努力实现的目标:

我有一个大的文本文件,我正试图用
re
解析它:根据文件中的标记,我想更改附加到其中的数组。例如:

x = np.array([])
y = np.array([])

with open("./data.txt", "r") as f:
    for line in f:
        if re.match('x values', line):
            print "reading x values"
            array = x
        elif re.match('y', line):
            print "reading y values"
            array = y
        else:
            values = re.match("^\s+((?:[0-9.E+-]+\s*)*)", line)
            if values:
                np.append(array, values.groups()[0].split())
In [98]: np.concatenate([[1,2,3],[1,2]])
Out[98]: array([1, 2, 3, 1, 2])

In [99]: np.array([[1,2,3],[1,2]])
Out[99]: array([[1, 2, 3], [1, 2]], dtype=object)

In [100]: np.array([[1,2,3],[1,2,4]])
Out[100]: 
array([[1, 2, 3],
       [1, 2, 4]])

看看
numpy.hstack


返回
数组([0,1,2,3,4,5,6,7,8,9,5])

根据您更新的问题,似乎您可以通过保留numpy数组字典轻松解决问题:

x = np.array([])
y = np.array([])
Arrays = {"x": x, "y": y}

with open("./data.txt", "r") as f:
    for line in f:
        if re.match('x values', line):
            print "reading x values"
            key = "x"
        elif re.match('y', line):
            print "reading y values"
            key = "y"
        else:
            values = re.match("^\s+((?:[0-9.E+-]+\s*)*)", line)
            if values:
                Arrays[key] = np.append(Arrays[key], values.groups()[0].split())
正如Sven Marnach在这里的评论和您的问题中指出的,这是numpy数组的低效使用

更好的方法(正如斯文指出的那样)是:

Arrays = {"x": [], "y": []}

with open("./data.txt", "r") as f:
    for line in f:
        if re.match('x values', line):
            print "reading x values"
            key = "x"
        elif re.match('y', line):
            print "reading y values"
            key = "y"
        else:
            values = re.match("^\s+((?:[0-9.E+-]+\s*)*)", line)
            if values:
                Arrays[key].append(values.groups()[0].split())

Arrays = {key: np.array(Arrays[key]) for key in Arrays}

因此,切换到list append的简单操作可以写成:

x, y = [], []
with open("./data.txt", "r") as f:
    for line in f:
        if re.match('x values', line):
            print "reading x values"
            alist = x
        elif re.match('y', line):
            print "reading y values"
            alist = y
        else:
            values = re.match("^\s+((?:[0-9.E+-]+\s*)*)", line)
            if values:
                alist.append(values.groups()[0].split())
现在
x
y
都将是列表列表。如果子列表的大小都相同,则可以执行以下操作

x_array = np.array(x)
获取二维数组。但是,如果子列表的大小不同,这将生成一个1d数组
dtype=object
,它只不过是一个开销为
array
的列表。例如:

x = np.array([])
y = np.array([])

with open("./data.txt", "r") as f:
    for line in f:
        if re.match('x values', line):
            print "reading x values"
            array = x
        elif re.match('y', line):
            print "reading y values"
            array = y
        else:
            values = re.match("^\s+((?:[0-9.E+-]+\s*)*)", line)
            if values:
                np.append(array, values.groups()[0].split())
In [98]: np.concatenate([[1,2,3],[1,2]])
Out[98]: array([1, 2, 3, 1, 2])

In [99]: np.array([[1,2,3],[1,2]])
Out[99]: array([[1, 2, 3], [1, 2]], dtype=object)

In [100]: np.array([[1,2,3],[1,2,4]])
Out[100]: 
array([[1, 2, 3],
       [1, 2, 4]])

我认为使用这两个全局变量与使用列表字典
{“x”:[],“y”:[]}
方法之间不会有太大的时间差异。全局变量也保存在字典中


真正的问题是您是否在列表或数组中收集中间值。

这有助于在不创建副本的情况下追加到数组中吗?您可以执行
a=np.hstack((a,b))
这将创建副本,但要避免的是OP的整个问题。您不能这样做。Numpy数组是在内存中连续分配的,因此如果要调整它们的大小,需要重新分配它们。附加在它们之上本质上是低效的。你能给我一点你的问题的背景吗?当然可以,现在编辑@SvenMarnach的副本。@hansatz以这种方式使用NumPy数组是非常低效的。收集列表中的数据,并在读取完文件后从列表中构建一个Numpy数组。@SvenMarnach好的,了解效率很好。我将以这种方式处理它,然后这段代码将具有二次运行时,所以这样做并不明智。是否有特定的原因在链接对象上使用字典。i、 e.
b=a;b、 追加(1)
当使用python列表时?@hansatz,我发现字典更可读,代码更清晰。当两者都是可变的时,有很多人不理解
a=b
的含义,因此我建议避免使用依赖于此的方法behavior@hansatz一本字典很容易扩展到两个以上的条目