我正在读数据并尝试创建一个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)
正如我所期望的那样。
知道我做错了什么吗?
谢谢!
答案 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