Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.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 如何为前两个维度使用csv文件制作3D列表?_Python_Python 3.x - Fatal编程技术网

Python 如何为前两个维度使用csv文件制作3D列表?

Python 如何为前两个维度使用csv文件制作3D列表?,python,python-3.x,Python,Python 3.x,我对python不是很熟悉,所以谷歌搜索和有教养的猜测让我尝试了一个列表理解解决方案,但我认为我的格式有问题。这一行给了我一个语法错误,那么有办法修复它吗 3dCSV = [[0 for _ in range(2)]list(csv.reader(open(sys.argv[1])))] 任何帮助都将不胜感激,谢谢 csv实际上只是一个二维数字数组 例如: 9 4 3 5 4 3 9 4 7 2 4 1 6 3 4 3 4 8 2 8 我只想在上面添加

我对python不是很熟悉,所以谷歌搜索和有教养的猜测让我尝试了一个列表理解解决方案,但我认为我的格式有问题。这一行给了我一个语法错误,那么有办法修复它吗

    3dCSV = [[0 for _ in range(2)]list(csv.reader(open(sys.argv[1])))]
任何帮助都将不胜感激,谢谢

csv实际上只是一个二维数字数组

例如:

    9 4 3 5 4
    3 9 4 7 2
    4 1 6 3 4
    3 4 8 2 8

我只想在上面添加一个三维空间来容纳0或1(基本上是一个布尔值),这样我就可以测试
list[a][b][0]
,根据我得到的输出,将0或1放入
list[a][b][1]
。我真的不知道如何给出一个更好的示例?

这里有一个简短的示例,它只是从文件中读取行,在空白处拆分,并将每个项转换为成对的
[int,None]

import pprint

with open('source.csv') as f:
    res = [[[int(x), None] for x in row.split()] for row in f]

res[1][2][1] = (res[1][2][0] % 2 == 0)
pprint.pprint(res)
输出:

[[[9, None], [4, None], [3, None], [5, None], [4, None]],
 [[3, None], [9, None], [4, True], [7, None], [2, None]],
 [[4, None], [1, None], [6, None], [3, None], [4, None]],
 [[3, None], [4, None], [8, None], [2, None], [8, None]]]   
在上面的
中,对于f中的行
只需从文件中逐个读取行:

>>> rows = [row for row in f]
>>> rows
['9 4 3 5 4\n', '3 9 4 7 2\n', '4 1 6 3 4\n', '3 4 8 2 8\n']
然后,
对于行中的x.split()
使用
str.split
在每个空格处分割行:

>>> rows = [[x for x in row.split()] for row in f]
>>> rows
[['9', '4', '3', '5', '4'], ['3', '9', '4', '7', '2'], ['4', '1', '6', '3', '4'], ['3', '4', '8', '2', '8']]
由于我们希望在最终结果中包含
[int,None]
元素,而不是字符串,因此我们相应地转换每个元素:

>>> rows = [[[int(x), None] for x in row.split()] for row in f]
>>> print(*rows, sep='\n')
[[9, None], [4, None], [3, None], [5, None], [4, None]]
[[3, None], [9, None], [4, None], [7, None], [2, None]]
[[4, None], [1, None], [6, None], [3, None], [4, None]]
[[3, None], [4, None], [8, None], [2, None], [8, None]]

这是你想要的吗?因此,无论您何时调用3dcsv[a][b],它都会以您设置的任何方式回复True或False。要将所有内容更改为False,只需将True替换为False:

import csv
filename='something.csv' #Enter your filename
with open(filename, 'r') as csvfile:
    _3dcsv = list(csv.reader(csvfile))

for index, i in enumerate(_3dcsv):
    for index2, e in enumerate(i):
        _3dcsv[index][index2]={e:True} #or false
输出:

[[{'1': True}, {'2': True}, {'3': True}, {'4': True}, {'5': True}],
 [{'4': True}, {'5': True}, {'2': True}, {'3': True}, {'5': True}],
 [{'4': True}, {'5': True}, {'6': True}, {'7': True}, {'1': True}]]

如果您要处理大量CSV文件和数组样式的数据,那么您应该查看哪一个是python的数组/数学库。安装它和python的最简单方法是从

安装numpy后,请执行以下操作:

import numpy as np
您需要指定数据类型(int表示整数或float表示整数) 如果您的数字不是浮动的,则默认为浮动

arr2d = np.loadtxt(sys.argv[1], dtype=int)
print(arr2d)
产出:

array([[9, 4, 3, 5, 4],
       [3, 9, 4, 7, 2],
       [4, 1, 6, 3, 4],
       [3, 4, 8, 2, 8]])
array([[1, 1, 3, 1, 1],
       [3, 1, 1, 1, 2],
       [1, 1, 1, 3, 1],
       [3, 1, 1, 2, 1]])
现在创建一个形状相同的布尔数组,其中所有值都大于3(作为示例)

arrbool = arr2d > 3
print(arrbool)
输出

[[ True  True False  True  True]
 [False  True  True  True False]
 [ True False  True False  True]
 [False  True  True False  True]]
使用arrbool数组作为掩码,仅在真位置设置值 到某个数字(复制数组或修改原始数组)

产出:

array([[9, 4, 3, 5, 4],
       [3, 9, 4, 7, 2],
       [4, 1, 6, 3, 4],
       [3, 4, 8, 2, 8]])
array([[1, 1, 3, 1, 1],
       [3, 1, 1, 1, 2],
       [1, 1, 1, 3, 1],
       [3, 1, 1, 2, 1]])

你好:)很难确定目的。。。你能举例说明你的csv的一行应该是什么样子吗?请提供csv示例和预期结果,因为它不可能提供有意义的答案。不知道你想做什么,请提供一个示例你运行代码了吗?不能以十进制数字开头,csv使用
作为默认分隔符。@niemmi抱歉,我在这里发布时更改了名称,因为@Kalahira使用了这个名称。我完全忘记了它,我用自己的变量名运行了代码,所以它工作了。