Skip to content

Commit ee9d707

Browse files
committed
performance enhancement.
1 parent f9af308 commit ee9d707

8 files changed

Lines changed: 53 additions & 119 deletions

File tree

src/NumSharp.Core/Backends/Default/ArrayManipulation/Default.Transpose.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,7 @@ public NDArray Transpose(NDArray x, int[] axes = null)
2020
{
2121
nd = new NDArray(x.Array, x.shape.Reverse().ToArray());
2222

23-
for (int idx = 0; idx < nd.shape[0]; idx++)
24-
for (int jdx = 0; jdx < nd.shape[1]; jdx++)
25-
nd[idx, jdx] = x[jdx, idx];
23+
nd = nd.reshape((2, 3), order: x.order == "C" ? "F" : "C");
2624
}
2725
else
2826
{

src/NumSharp.Core/Backends/IStorage.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ public interface IStorage : ICloneable
110110
/// </summary>
111111
/// <param name="value"></param>
112112
/// <param name="indexes"></param>
113-
void SetData<T>(T value, Shape indexes);
113+
void SetData<T>(T value, params int[] indexes);
114114

115115
/// <summary>
116116
/// Set an Array to internal storage, cast it to new dtype and change dtype

src/NumSharp.Core/Backends/NDStorage.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,7 @@ public void SetData(Array values)
372372
/// </summary>
373373
/// <param name="value"></param>
374374
/// <param name="indexes"></param>
375-
public void SetData<T>(T value, Shape indexes)
375+
public void SetData<T>(T value, params int[] indexes)
376376
{
377377
int idx = _Shape.GetIndexInShape(indexes);
378378
switch (value)
@@ -381,7 +381,7 @@ public void SetData<T>(T value, Shape indexes)
381381
_values.SetValue(val, idx);
382382
break;
383383
case bool[] values:
384-
if (indexes.NDim == 0)
384+
if (indexes.Length == 0)
385385
_values = values;
386386
else
387387
_values.SetValue(values, idx);
@@ -390,7 +390,7 @@ public void SetData<T>(T value, Shape indexes)
390390
_values.SetValue(val, idx);
391391
break;
392392
case byte[] values:
393-
if (indexes.NDim == 0)
393+
if (indexes.Length == 0)
394394
_values = values;
395395
else
396396
_values.SetValue(values, idx);
@@ -399,7 +399,7 @@ public void SetData<T>(T value, Shape indexes)
399399
_values.SetValue(val, idx);
400400
break;
401401
case int[] values:
402-
if (indexes.NDim == 0)
402+
if (indexes.Length == 0)
403403
_values = values;
404404
else
405405
_values.SetValue(values, idx);
@@ -408,7 +408,7 @@ public void SetData<T>(T value, Shape indexes)
408408
_values.SetValue(val, idx);
409409
break;
410410
case long[] values:
411-
if (indexes.NDim == 0)
411+
if (indexes.Length == 0)
412412
_values = values;
413413
else
414414
_values.SetValue(values, idx);
@@ -417,7 +417,7 @@ public void SetData<T>(T value, Shape indexes)
417417
_values.SetValue(val, idx);
418418
break;
419419
case float[] values:
420-
if (indexes.NDim == 0)
420+
if (indexes.Length == 0)
421421
_values = values;
422422
else
423423
_values.SetValue(values, idx);
@@ -426,7 +426,7 @@ public void SetData<T>(T value, Shape indexes)
426426
_values.SetValue(val, idx);
427427
break;
428428
case double[] values:
429-
if (indexes.NDim == 0)
429+
if (indexes.Length == 0)
430430
_values = values;
431431
else
432432
_values.SetValue(values, idx);

src/NumSharp.Core/Backends/NDTypedStorage.cs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -446,7 +446,7 @@ public void SetData(Array values)
446446
/// </summary>
447447
/// <param name="value"></param>
448448
/// <param name="indexes"></param>
449-
public void SetData<T>(T value, Shape indexes)
449+
public void SetData<T>(T value, params int[] indexes)
450450
{
451451
int idx = _Shape.GetIndexInShape(indexes);
452452
switch (value)
@@ -455,7 +455,7 @@ public void SetData<T>(T value, Shape indexes)
455455
_arrayBoolean[idx] = val;
456456
break;
457457
case bool[] values:
458-
if (indexes.NDim == 0)
458+
if (indexes.Length == 0)
459459
_arrayBoolean = values;
460460
else
461461
_arrayBoolean.SetValue(values, idx);
@@ -464,7 +464,7 @@ public void SetData<T>(T value, Shape indexes)
464464
_arrayByte[idx] = val;
465465
break;
466466
case byte[] values:
467-
if (indexes.NDim == 0)
467+
if (indexes.Length == 0)
468468
_arrayByte = values;
469469
else
470470
_arrayByte.SetValue(values, idx);
@@ -473,7 +473,7 @@ public void SetData<T>(T value, Shape indexes)
473473
_arrayInt32[idx] = val;
474474
break;
475475
case int[] values:
476-
if (indexes.NDim == 0)
476+
if (indexes.Length == 0)
477477
_arrayInt32 = values;
478478
else
479479
_arrayInt32.SetValue(values, idx);
@@ -482,7 +482,7 @@ public void SetData<T>(T value, Shape indexes)
482482
_arrayInt64[idx] = val;
483483
break;
484484
case long[] values:
485-
if (indexes.NDim == 0)
485+
if (indexes.Length == 0)
486486
_arrayInt64 = values;
487487
else
488488
_arrayInt64.SetValue(values, idx);
@@ -491,7 +491,7 @@ public void SetData<T>(T value, Shape indexes)
491491
_arraySingle[idx] = val;
492492
break;
493493
case float[] values:
494-
if (indexes.NDim == 0)
494+
if (indexes.Length == 0)
495495
_arraySingle = values;
496496
else
497497
_arraySingle.SetValue(values, idx);
@@ -500,11 +500,17 @@ public void SetData<T>(T value, Shape indexes)
500500
_arrayDouble[idx] = val;
501501
break;
502502
case double[] values:
503-
if (indexes.NDim == 0)
503+
if (indexes.Length == 0)
504504
_arrayDouble = values;
505505
else
506506
_arrayDouble.SetValue(values, idx);
507507
break;
508+
case string[] values:
509+
if (indexes.Length == 0)
510+
_arrayString = values;
511+
else
512+
_arrayString.SetValue(values, idx);
513+
break;
508514
case NDArray nd:
509515
switch(nd.dtype.Name)
510516
{

src/NumSharp.Core/Selection/NDArray.Indexing.cs

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -105,37 +105,37 @@ private NDArray setValue2D<T>(NDArray indexes)
105105
{
106106
var buf = Data<T>();
107107
var idx = indexes.Data<int>();
108-
var selectedValues = new NDArray(dtype, new Shape(indexes.size, shape[1]));
108+
var nd = new NDArray(dtype, new Shape(indexes.size, shape[1]));
109109

110-
Parallel.For(0, selectedValues.shape[0], (row) =>
110+
Parallel.For(0, nd.shape[0], (row) =>
111111
{
112-
for (int col = 0; col < selectedValues.shape[1]; col++)
113-
selectedValues.SetData(buf[Storage.Shape.GetIndexInShape(idx[row], col)], row, col);
112+
for (int col = 0; col < nd.shape[1]; col++)
113+
nd.SetData(buf[Storage.Shape.GetIndexInShape(idx[row], col)], row, col);
114114
});
115115

116-
return selectedValues;
116+
return nd;
117117
}
118118

119119
private NDArray setValue3D<T>(NDArray indexes)
120120
{
121121
var buf = Data<T>();
122-
var selectedValues = new NDArray(dtype, new Shape(indexes.size, shape[1], shape[2]));
122+
var nd = new NDArray(dtype, new Shape(indexes.size, shape[1], shape[2]));
123123
var idx = indexes.Data<int>();
124124

125-
Parallel.For(0, selectedValues.shape[0], (item) =>
125+
Parallel.For(0, nd.shape[0], (item) =>
126126
{
127-
for (int row = 0; row < selectedValues.shape[1]; row++)
128-
for (int col = 0; col < selectedValues.shape[2]; col++)
129-
selectedValues.SetData(buf[Storage.Shape.GetIndexInShape(idx[item], row, col)], item, row, col);
127+
for (int row = 0; row < nd.shape[1]; row++)
128+
for (int col = 0; col < nd.shape[2]; col++)
129+
nd.SetData(buf[Storage.Shape.GetIndexInShape(idx[item], row, col)], item, row, col);
130130
});
131131

132-
return selectedValues;
132+
return nd;
133133
}
134134

135135
private NDArray setValue4D<T>(NDArray indexes)
136136
{
137137
var buf = Data<T>();
138-
var selectedValues = new NDArray(dtype, new Shape(indexes.size, shape[1], shape[2], shape[3]));
138+
var nd = new NDArray(dtype, new Shape(indexes.size, shape[1], shape[2], shape[3]));
139139
var idx = indexes.Data<int>();
140140

141141
/*
@@ -145,15 +145,15 @@ private NDArray setValue4D<T>(NDArray indexes)
145145
for (int channel = 0; channel < selectedValues.shape[3]; channel++)
146146
selectedValues.SetData(buf[Storage.Shape.GetIndexInShape(idx[item], row, col, channel)], item, row, col, channel);
147147
*/
148-
Parallel.For(0, selectedValues.shape[0], (item) =>
148+
Parallel.For(0, nd.shape[0], (item) =>
149149
{
150-
for (int row = 0; row < selectedValues.shape[1]; row++)
151-
for (int col = 0; col < selectedValues.shape[2]; col++)
152-
for (int channel = 0; channel < selectedValues.shape[3]; channel++)
153-
selectedValues.SetData(buf[Storage.Shape.GetIndexInShape(idx[item], row, col, channel)], item, row, col, channel);
150+
for (int row = 0; row < nd.shape[1]; row++)
151+
for (int col = 0; col < nd.shape[2]; col++)
152+
for (int channel = 0; channel < nd.shape[3]; channel++)
153+
nd.SetData(buf[Storage.Shape.GetIndexInShape(idx[item], row, col, channel)], item, row, col, channel);
154154
});
155155

156-
return selectedValues;
156+
return nd;
157157
}
158158

159159
public NDArray this[NDArray<bool> booleanArray]

test/NumSharp.UnitTest/Casting/NDArray.ImplicitCasts.Test.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,9 @@ public void StringCast1()
7878
{
7979
NDArray nd = "hello";
8080

81-
var a = (string) nd.Array.GetValue(0);
81+
string str = nd;
8282

83-
Assert.IsTrue(a == "hello");
83+
Assert.IsTrue(str == "hello");
8484
}
8585

8686
[TestMethod]

test/NumSharp.UnitTest/LinearAlgebra/NdArray.Transpose.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ public void TransposeVector()
2121
Assert.IsTrue(Enumerable.SequenceEqual(x.Data<int>(), y.Data<int>()));
2222
}
2323

24-
[Ignore("need to implement column-wise mode")]
2524
[TestMethod]
2625
public void Transpose3x2()
2726
{

0 commit comments

Comments
 (0)