NumPy:不正确地创建二维数组

时间:2018-04-12 20:18:54

标签: python numpy

我正在读数据并尝试创建一个NumPy形状数组(194,1)。所以看起来应该是:[[4], [0], [9], ...]

我这样做:

def parse_data(file_name):
    data = []
    target = []
    with open(file_name) as f:
        for line in f:
            temp = line.split()
            x = [float(x) for x in temp[:2]]
            y = float(temp[2])
            data.append(np.array(x))
            target.append(np.array(y))
    return np.array(data), np.array(target)

x, y = parse_data("data.txt")

当我检查y.shape时,它是(194,),而不是我预期的(194,1)

x的形状(194,2)正如我所期望的那样。

知道我做错了什么吗?

谢谢!

3 个答案:

答案 0 :(得分:3)

您似乎希望np.array(y)能够自动将标量y转换为1个元素的行。这不是NumPy的工作方式。

np.array(y) 0维。将一堆列表放在列表中并在列表上调用array会产生一维结果,而不是二维结果。

答案 1 :(得分:1)

当在由标量构建的numpy数组列表上调用np.array()时,它会连接它们,然后创建一个numpy数组,为你提供(194,)形状。

您可以随时将y重塑为所需的形状:

def parse_data(file_name):
    data = []
    target = []
    with open(file_name) as f:
        for line in f:
            temp = line.split()
            x = [float(x) for x in temp[:2]]
            y = float(temp[2])
            data.append(np.array(x))
            target.append(y)
    return np.array(data), np.array(target).reshape(-1, 1)

x, y = parse_data("data.txt")

当然,您也可以通过以下方式解决问题:

target.append(np.array([y]))

我上述行为的一个例子:

import numpy as np
a = np.array(5)
b = np.array(4)
v = [a, b]
v
>>>[array(5), array(4)]
np.array(v)
>>>array(5, 4) #arrays are concatenated

答案 2 :(得分:0)

我在迭代中跳过np.array

def parse_data(file_name):
    data = []
    target = []
    with open(file_name) as f:
        for line in f:
            temp = line.split()
            x = [float(x) for x in temp[:2]]
            y = float(temp[2])
            data.append(x)
            target.append(y)
    return np.array(data), np.array(target)

这会创建data,如:

 [[1.0, 2.0],[3.0, 4.0], ....]

target喜欢

 [1.2, 3.2, 3.1, ...]

np.array(data)然后将列表列表转换为2d数组,将数字列表转换为1d数组。

然后很容易为1d重塑或添加尺寸,使其成为(1,n)或(n,1)或者您需要的任何尺寸。

记住基本的数组构造方法是:

np.array([1,2,3])             # 1d
np.array([[1,2],[3,4]])       # 2d