我有以下代码。它在概念上与python reshape
函数大致类似。它成功地将1维数据加载到多维数组中,其维度直到运行时才知道。例如{209,64,64,3}
。我必须遍历1维数据并为数组的每个维度创建正确的索引。
private void InitializeData()
{
var imageData = ImageData.Load(txtFileName.Text); // one dimensional array
var dimensions = txtDimensions.Text.Split(',').Select(d => int.Parse(d)).ToArray(); // e.g., {-1,64,64,3}
int elements = 1;
foreach (var dim in dimensions.Skip(1))
{
elements *= dim;
}
dimensions[0] = imageData.Length / elements; // {209,64,64,3}
// create multipliers
var multipliers = new int[dimensions.Length - 1];
for (var dimension = 1; dimension < dimensions.Length; dimension++)
{
var multiplier = 1;
for (var followingdimension = dimension; followingdimension < dimensions.Length; followingdimension++)
{
multiplier *= dimensions[followingdimension];
}
multipliers[dimension - 1] = multiplier;
}
// load data
var dataArray = Array.CreateInstance(typeof(int), dimensions);
var indexes = new int[dimensions.Length];
for (var imageDataIndex = 0; imageDataIndex < imageData.Length; imageDataIndex++)
{
indexes[0] = imageDataIndex / multipliers[0];
indexes[dimensions.Length - 1] = imageDataIndex % multipliers[multipliers.Length - 1];
for (var multiplier = 1; multiplier < dimensions.Length - 1; multiplier++)
indexes[multiplier] = (imageDataIndex / multipliers[multiplier]) % dimensions[multiplier];
dataArray.SetValue(imageData[imageDataIndex], indexes);
}
}
有更快或更优雅的方式吗?我确实认识到这是两件不同的事情。我会在优雅的建议上做标记,但我仍然希望看到它们。因为这看起来太难看了,写起来太痛苦了,不是最好的方式。
注意(请)
数据可能并不总是图像数据,所以我不是在寻找位图操作。这只是发生在这里,但它不一定是典型的情况。并且,我的目标不是获取位图,而是获取数组。
答案 0 :(得分:0)
感谢How to reshape an Array in c#
,我得到了部分答案代码可以替换为:
id:"1" OR id:"2"
如果有更快的方式来实现 var imageData = ImageData.Load(txtFileName.Text); // one dimensional array
// e.g., {209,64,64,3}
var dimensions = txtDimensions.Text.Split(',').Select(d => int.Parse(d)).ToArray();
int elements = 1;
foreach (var dim in dimensions.Skip(1))
{
elements *= dim;
}
dimensions[0] = imageData.Length / elements;
// load data
var dataArray = Array.CreateInstance(typeof(int), dimensions);
Buffer.BlockCopy(imageData, 0, dataArray, 0, imageData.Length * sizeof(int));
或更简单的实际负载,我会感到惊讶。结果表明原始数据所处的维度形式,只要您可以将目标维度指定为目标数组的一部分,Buffer.BlockCopy
就会处理它。
我会继续寻找进一步完善其余原始代码的方法。