Skip to content

Commit 00d47c3

Browse files
committed
Added proper Simpson and modified Shannon
1 parent 4ec22ca commit 00d47c3

File tree

4 files changed

+150
-97
lines changed

4 files changed

+150
-97
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
/docs/build
55

66
Outputs
7+
old_bits_of_code
78

89
script_Kiel2025.py
910
script_TAG2024.py

exploration.ipynb

Lines changed: 136 additions & 47 deletions
Large diffs are not rendered by default.

metapypulation/metapopulation.py

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -177,25 +177,14 @@ def metapopulation_shannon_diversity(self) -> float:
177177
for individual in subpopulation.population:
178178
traits[i] = (individual.features)
179179
i += 1
180-
181-
shannons = []
182-
# looping over all features, for each feature extract the frequency of each trait in the population
183-
for k in range(0, number_of_features):
184-
frequencies = []
185-
feature_traits = traits[:, k]
186-
unique, counts = np.unique(feature_traits, return_counts=True)
187-
for trait_count in counts:
188-
trait_frequency = trait_count / (self.get_metapopulation_size())
189-
frequencies.append(trait_frequency)
190-
191-
frequencies = np.array(frequencies)
192-
shannon_for_trait = -np.sum(frequencies*np.log(frequencies))
193180

194-
shannons.append(shannon_for_trait)
181+
uniques, counts = np.unique(traits, axis = 0, return_counts = True)
195182

196-
shannon_index = np.mean(shannons)
183+
frequencies = counts / self.get_metapopulation_size()
184+
shannon_diversity_index = -np.sum(frequencies*np.log(frequencies))
185+
186+
return shannon_diversity_index
197187

198-
return shannon_index
199188

200189

201190
def metapopulation_test_sets(self) -> int:
@@ -233,11 +222,8 @@ def metapopulation_simpson(self) -> float:
233222

234223
uniques, counts = np.unique(traits, axis = 0, return_counts = True)
235224

236-
simpson_denominators = []
237-
for i in range(0, len(counts)):
238-
simpson_denominators.append(counts[i]*(counts[i]-1))
239-
240-
simpson_diversity_index = self.get_metapopulation_size()*(self.get_metapopulation_size() - 1) / sum(simpson_denominators)
225+
frequencies = counts / self.get_metapopulation_size()
226+
simpson_diversity_index = np.sum(frequencies*frequencies)
241227

242228
return simpson_diversity_index
243229

metapypulation/subpopulation.py

Lines changed: 6 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -182,29 +182,10 @@ def shannon_diversity(self) -> float:
182182
Returns:
183183
float: The current Shannon diversity index in the subpopulation.
184184
"""
185-
number_of_features = self.population.individuals[0].number_of_features
186-
traits = np.zeros((self.get_population_size(), number_of_features))
187-
i = 0
188-
for individual in self.population:
189-
traits[i] = (individual.features)
190-
i += 1
191-
192-
shannons = []
193-
# looping over all features, for each feature extract the frequency of each trait in the population
194-
for k in range(0, number_of_features):
195-
frequencies = []
196-
feature_traits = traits[:, k]
197-
unique, counts = np.unique(feature_traits, return_counts=True)
198-
for trait_count in counts:
199-
trait_frequency = trait_count / (self.get_population_size())
200-
frequencies.append(trait_frequency)
201-
202-
frequencies = np.array(frequencies)
203-
shannon_for_trait = -np.sum(frequencies*np.log(frequencies))
204-
205-
shannons.append(shannon_for_trait)
206-
207-
shannon_index = np.mean(shannons)
185+
traits = self.return_traits_sets()
186+
uniques, counts = np.unique(traits, axis = 0, return_counts=True)
187+
frequencies = counts / self.get_population_size()
188+
shannon_index = -np.sum(frequencies*np.log(frequencies))
208189

209190
return shannon_index
210191

@@ -217,13 +198,9 @@ def simpson_diversity(self) -> float:
217198
"""
218199
traits = self.return_traits_sets()
219200
uniques, counts = np.unique(traits, axis = 0, return_counts=True)
201+
frequencies = counts / self.get_population_size()
202+
simpson_diversity_index = np.sum(frequencies*frequencies)
220203

221-
simpson_denominators = []
222-
for i in range(0, len(counts)):
223-
simpson_denominators.append(counts[i]*(counts[i]-1))
224-
225-
simpson_diversity_index = self.get_population_size()*(self.get_population_size() - 1) / sum(simpson_denominators)
226-
227204
return simpson_diversity_index
228205

229206
class IndividualsIterator(object):

0 commit comments

Comments
 (0)